last day (15 days later) » 

11:34
1
Q: Как быстро определить наличие строки в файле, при этом не засорять ОЗУ?

Evil12BoyЕсть код для примера. Он находится в цикле. Каждый раз генерируется случайная строка. bool F = true; HashSet<string> HS = new(File.ReadAllLines(path)); Random rnd = new(); string Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"; int Length= 42; while (F) { StringBuild...

Верно подметили, я не знал, что здесь нужно иметь привилегии для того, чтобы оставить под чужими вопросом комментарий)
Плюс я забыл тогда банально зарегистрироваться 😅
Задача то в чём состоит формально - что вы сгенерите все строки из файла в итоге или в чём? Может хранение только хэшей поможет, а может и нет. Сформулируйте чётко задачу. Зачем вы генерите строки и проверяете есть ли они в файле?
Ну например читать строки, считать хэши, и сохранять только хэш и смещение строки в файле. При проверке искать хэш, если найден - читать и сверять оригинальную строку.
В файл записаны очень много тех же строк, что и генерирует мой код. И мне нужно просто проверять когда будет сходство.
11:34
Давайте конкретный пример, отредактируйте вопрос. Обсуждаем сферические строки в вакууме. Какой код? Как часто выполняется? Какие данные в файле? Есть ли повторяющиеся строки? Как читается файл? Для чего это всё? А пока получается как в анекдоте: "У меня не работает! Что не работает? Начего не работает! А надо что? А надо, чтобы работало!"
В файле находятся строки с фиксированной шириной, разделены табуляцией. Файл читал банально через File.ReadAllLines. Повторяющихся строк нету.
Выполняется всё в цикле, цикл работает до тех пор, пока не будет совпадений
Я б запихал всё в базу данных (банальный sqlite). Или посмотрел более подходящие структуры данных, тот же trie, например.
Нажмите кнопку edit, дополните вопрос кодом и деталями. Пока что не на что отвечать.
Вообще тут напрашивается предварительная сортировка строк и двоичный поиск в каком-то виде. Тогда в ОЗУ вообще можно ничего не хранить. Ну или хранить в ОЗУ ссылки на начала блоков в файле, начинающихся на какую-то букву, например.
Я присоединюсь к комментаторам вышел: предварительная сортировка и двоичный поиск будет давать мгновенный результат. А чтобы не возиться с этим вручную взять sqlite с индексом на колонке. Вес этой СУБД незначителен по сравнению с весом файла.
11:34
@AlexanderPetrov , попробую повозиться с sqlite, может действительно поможет)
@Evil12Boy Создайте папки с именами A, B, C, D, E, F и G. И храните там те строки, которые начинаются с соответствующего символа. Если вы создадите внутри папки A те же подпапки (A, B, C, D, E, F и G), то вы можете сократить поиск уже в 7*7=49 раз. Сделайте 6 или 7 уровней вложенности и тест будет тривиальным. А вообще, для таких задач используют фильтр Блума.
@Aycon Кстати, да, отличная идея с папками. Нужно использовать возможности файловой системы, чтобы самому дерево не строить )
Файл с рандомными строками и проверки не нужны. Можно использовать генератор (псевдо) случайных строк без повторений.
@user7860670, это был просто пример, в настоящем коде у меня используется совсем другой способ генерации.
Сейчас пытаюсь разобраться с sqlite, иначе придётся искать другой способ(
@Aycon, главной задачей было не только ускорить проверку, но и уменьшить вес занимаемых данных файла в ОЗУ.
@Evil12Boy если хотите сделать и то и другое - лучше не используйте файл. Я полагаю, что вы хотите сгенерировать словарь из всех слов алфавита A-G с длинной слова до 10 символов. Какой бы ни была конечная цель обработки - брутфорс пароля или что-то в этом роде - проще и быстрее генерировать слова налету по порядку. AAAAAAAAAA, AAAAAAAAAB, AAAAAAAAAC ...
@Evil12Boy покажите тот код, который вы действительно используете или объясните как вы собираетесь использовать этот файл. Исходя из всех вводных, которые вы предоставили - вам дали наиболее удачные направления для решения поставленной задачи. Может быть есть ещё что-то о чём вы умалчиваете?
11:34
@Aycon, вы немного не поняли принцип работы моего кода. У меня уже есть файл, в котором например 10 млн строк. Они не обязательно должны быть шириной в 10 символов. Моя цель это проверка на схожесть сгенерированой строки с каждой строкой в файле. На счёт брутфорса пароля, то цели похожие, но у меня идея не противозаконная )
@Aycon Если это брутфорс, то первым делом нужно посчитать, насколько это вообще реалистичная затея. А то может оказаться, что вариантов столько, что даже перебор по миллиону вариантов в секунду не успеет закончиться до конца нашей Вселенной ))
Меня сейчас интересует, как можно проверять одну строку со всеми строками из файла, да так, чтобы ОЗУ не страдало и скорость нормальная была
@Evil12Boy Если способ генерации зависит не от вас и вы работаете с таким большим количеством данных, вам следует обратить внимание на персистентные деревья (или другие структуры данных, которые используют дихотомию). И PostgreSQL ничем не хуже, чем SQLite. Данные слишком велики чтобы воротить нос перед хорошими решениями. Кроме того, я всё-же настоятельно рекомендую ознакомиться с алгоритмом фильтра Блума для быстрого поиска строки в "файле".
@CrazyElf, затея 100% рабочая, на практике просто ОЗУ почти в сотку забито, а так прога работает
@Aycon, ок, пошёл реализовывать фильтр Блума 😁
@Evil12Boy используйте дихотомию. Разделите строки в файле на чанки (а лучше дерево) и проверяйте кэшем или другим методом, который зависит от вашего разделения данных.
@Evil12Boy это действительно хорошее решение. Возможно, стоит поискать готовую реализацию.
11:34
Если у меня получится реализовать всё что мне нужно через фильтр Блума, я напишу это как ответ и на этом вопрос закрыт)
@Evil12Boy строки, которые вы предоставили повторяются

last day (15 days later) »