我有一個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