У меня есть файл 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 для поиска, а затем извлечения данных.