Какую структуру данных следует использовать для чтения и хранения около 5 миллионов записей из текстового файла - PullRequest
3 голосов
/ 19 августа 2011

Мне приходится иметь дело с двумя текстовыми файлами, размером около 1 ГБ, и сравнивать данные в файлах. Какую структуру данных я должен использовать для хранения данных? Сравнение таких огромных записей с использованием словарей / хеш-таблиц приводит к исключению нехватки памяти. Или я должен прочитать и сохранить данные в базе данных?

Ответы [ 4 ]

2 голосов
/ 19 августа 2011

По сути, база данных лучше всего подходит для такого рода поведения, она предназначена для работы с таким большим количеством данных и требует больше работы для оптимизации этого сценария, чем вы, вероятно, сможете сделать.

В качестве альтернативы вы можете использовать InProcess SQL, например SqlLite, или даже сценарий NoSql, такой как Raven или MongoDB.

2 голосов
/ 19 августа 2011

.NET Framework 4 предоставляет функцию Отображенные в память файлы (хе, старые добрые win32 API предоставляют такую ​​возможность уже много лет), вы можете отобразить разные части файла в отдельный сегмент и обрабатывать их одновременно.1003 *

Для работы с отображенным в память файлом необходимо создать представление всего отображаемого в памяти файла или его части.Вы также можете создать несколько представлений для одной и той же части отображенного в памяти файла, тем самым создавая одновременную память.Чтобы два представления оставались одновременными, они должны быть созданы из одного и того же файла с отображением в памяти.

Может также потребоваться несколько представлений, если размер файла превышает размер логической памяти приложения, доступной для сопоставления памяти (2 ГБ на 32-разрядном компьютере).

0 голосов
/ 19 августа 2011

Если вы можете отсортировать какой-либо атрибут в записях, который также используется для сравнения, вы можете использовать сортировка слиянием для сортировки файлов и сканирования их параллельно без необходимости сохранять вседанные в основной памяти.

Проверка того, что запись в первом файле также присутствует во втором файле, имеет сложность O (n ^ 2), если вы используете два вложенных цикла.Но если файлы отсортированы, вы можете использовать один цикл.Кроме того, сортировка слиянием имеет сложность O (n log n).Общая сложность O (n log n), что лучше, чем O (n ^ 2). Здесь - реализация сортировки слиянием в C #.

Я думаю, что вы можете достичь того же результата (с точки зрения скорости), используя базу данных, если записи проиндексированы.

0 голосов
/ 19 августа 2011

Это яркий пример использования базы данных.В зависимости от вашей структуры потребуется скрипт, определяющий его макет для добавления значений в базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...