Поиск 1GB CSV файла - PullRequest
       4

Поиск 1GB CSV файла

2 голосов
/ 10 ноября 2011

У меня есть файл CSV. Каждая строка состоит из одного и того же формата, например, /

I,h,q,q,3,A,5,Q,3,[,5,Q,8,c,3,N,3,E,4,F,4,g,4,I,V,9000,0000001-100,G9999999990001800000000000001,G9999999990000001100PDNELKKMMCNELRQNWJ010, , , , , , ,D,Z,

У меня есть Dictionary<string, List<char>>

Заполняется путем открытия файла, чтения каждой строки, извлечения элементов из строки и добавления ее в словарь, после чего файл закрывается.

Словарь используется в другом месте программы, где он принимает входные данные в программу, а затем находит ключ в словаре и использует 24 элемента для сравнения с входными данными.

StreamReader s = File.OpenText(file);
 string lineData = null;
 while ((lineData = s.ReadLine()) != null)
 {
   var elements = lineData.Split(',');
   //Do stuff with elements
   var compareElements = elements.Take(24).Select(x => x[0]);
   FileData.Add(elements[27], new List<char>(compareElements));

  }
  s.Close();

Мне только что сказали, что файл CSV теперь будет 800 МБ и будет содержать около 8 миллионов записей. Я только что попытался загрузить это на свой двухъядерный Win 32-битный ноутбук с 4 ГБ оперативной памяти в отладке, и он выбросил OutOfMemoryException.

Сейчас я думаю, что лучшим вариантом будет не загружать файл в память, но мне нужно найти способ быстро найти файл, чтобы увидеть, имеет ли входные данные соответствующий элемент, равный element[27], и затем взять первый 24 элемента в этом CSV и сравнить его с входными данными.

a) Даже если бы я придерживался этого подхода и использовал 16 ГБ ОЗУ и Windows 64bit, было бы хорошо, если бы в словаре было столько элементов?

б) Не могли бы вы предоставить код / ​​ссылки на способы быстрого поиска файла CSV, если вы не думаете, что использование словаря - хороший план

ОБНОВЛЕНИЕ: Хотя я принял ответ, мне просто интересно, что думают люди об использовании FileStream для поиска, а затем извлечения данных.

Ответы [ 6 ]

4 голосов
/ 10 ноября 2011

Если вы планируете выполнять поиск по такому количеству записей, я бы предложил массово вставить файл в СУБД, например SQL Server, с соответствующими индексами для полей, которые будут вашими критериями, а затем использовать запрос SQL для проверки существования. записи.

0 голосов
/ 27 мая 2012
  • забыть MS доступ.Действительно.
  • попробуйте sqlite, это будет более чем достаточно для нескольких миллионов строк
  • , если вы не можете проиндексировать свои данные, тогда не используйте базу данных, используйте внешнюю утилиту, такую ​​какegrep с соответствующим регулярным выражением для поиска определенных полей.Это будет намного быстрее.
0 голосов
/ 10 ноября 2011

Поскольку остальная часть вашей программы использует записи StringDictionary, в идеале вам все же нужно сохранять свои результаты в памяти - вы действительно не хотите выполнять запросы к БД 1000 раз. (Это может зависеть, если ваша программа живет на сервере БД)!

Я бы посмотрел на использование памяти StringDictionary для вашей структуры, посмотрел, каковы ваши теоретические максимумы, и посмотрел бы, можете ли вы рассказать об этом в предупреждении о функциональных требованиях. В противном случае ищите более эффективный способ хранения - например, потоковая передача ваших результатов в файл XML будет быстрее, чем в БД.

0 голосов
/ 10 ноября 2011

Решением может быть разбиение файла на несколько более мелких файлов и параллельный поиск в каждом файле, порядок поиска будет меньше или равен n (чтение всего файла)

0 голосов
/ 10 ноября 2011

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

a) Вы можете загрузить данные в реляционную базу данных, хотя это может быть излишним для данных этого типа.

b) Вы можете использовать решение NoSQL, такое как RavenDB ,Я думаю, что это может быть хорошим вариантом для вас.

в) Вы можете использовать более эффективный вариант физического хранения, например Lucene

г) Вы можете использовать более эффективныйопция в памяти / кеширование, например Redis .

0 голосов
/ 10 ноября 2011

У нас была похожая проблема с импортом большого CSV-файла, содержащего данные, которые нужно было агрегировать.В конце мы сделали массовую вставку в таблицу SQL Server и использовали SQL для агрегирования.В конце это было довольно быстро (пара минут подряд).

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