我有一个CSV文件。每一行是由相同的格式例如/搜索1GB 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文件现在是800MB,并且其中有大约800万条记录。我刚刚尝试在调试中装载4GB内存的Dual Core Win 32bit笔记本电脑上加载它,并且它投掷了一个OutOfMemoryException
。
我现在认为不将文件加载到内存中将是最好的选择,但需要找到一种快速搜索文件的方式,以查看输入数据是否具有匹配的项目等于element[27]
,然后将第24项该CSV中的元素并将其与输入数据进行比较。
a)即使我坚持使用这种方法,并使用16GB内存和Windows 64位将有一个字典中的许多项目是好的?
b)您能否提供一些代码/链接的方式来搜索一个CSV迅速文件,如果你不使用词典认为这是一个很好的计划
UPDATE:虽然我已经接受一个答案,我只是想知道什么人的想法是使用FileStream进行查找然后提取数据。
没有答案,只是一个建议:使用数据库,而不是一个CSV文件!如果你需要单一的数据库文件,SQLite是你的唯一。 – Marco
将1GB数据存入内存绝对不是一个明智的选择。您可能不希望程序耗尽所有可用RAM。改用DBMS。 – Raptor
@Marco你是说创建的数据库文件是一个文件?如果是这样,我假设我可以通过创建一个新的DB文件并删除任何旧文件来将CSV文件导入到数据库中? – Jon