2017-05-01 29 views
0

我正在與一個非常大的csv文件,不斷增長。基本上,我的程序檢查是否存在特定的ID號碼。如果存在,則使用數組中的數據。如果它不存在,它會從互聯網上下載數據並將其添加到陣列中。VB.NET:大陣列 - 更快的選擇?

這裏是我的數組:

Public Shared ClientSideData(0 To 99999, 0 To 5) As String '"MLS Number","GLA","Latitude","Longitude","Year Built","Acreage","ClientSideNext" 

這裏是一個CSV文件中的示例行:

"21633662","1631","40.298488","-74.052182","1950","0.1791"

這裏是很簡單的功能我用它來檢查,如果MLS#存在:

Function ClientSideLoc(mls As String) As Integer 
    For i = 0 To GlobalVariables.ClientSideCount - 1 
     If GlobalVariables.ClientSideData(i, 0) = mls Then 
      Return i 
      Exit Function 
     End If 
    Next 
    Return -1 
End Function 

CSV文件有時會每天添加500個條目。它正在快速增長。一旦它超過了10萬條,我現在的計劃就是回到原來的新條目。我有一種感覺,這種ClientSideLoc功能最終會比我每次從互聯網上下載缺失的信息的速度慢下來。

我很好奇,如果有更快的選擇?你會推薦什麼?數據庫會是更好的選擇嗎?我不熟悉它們。謝謝

+0

使用像CSVHelper這樣的CSV解析工具將會更快更簡潔 - 數據可以存儲爲鍵入數據而不是轉換爲字符串。 – Plutonix

+0

這可以有無限數量的條目?由於內存問題,我目前限制我的輸入爲100,000 – brand0

+0

您當前的搜索與ClientSideData中的項目數量呈線性關係。以更多內存消耗爲代價,你可以在數組中添加一個'mls'索引到位置,例如使用'Dictionary(Of String,Integer)'。這將在大致不變的時間內完成查找。如果您使用數據庫並在與'mls'對應的字段上放置索引,那麼數據庫將會爲您加速查找。 – Craig

回答

0

字典解決方案是我在找的東西。沒有幫助我的記憶問題,但沒關係。現在回答這個問題。謝謝克雷格!

+0

什麼是內存問題? –

1

我建議每天將csv文件處理成數據庫中的表格。即使像Access一樣可以爲此工作。然後你可以查詢數據庫表,而不用擔心內存消耗。

另外:這看起來像每記錄約76個字節,如果你有一個CSV閱讀器,讓您高效和解析列相應類型:

MLS#:8字符的字符串* 4個%的Unicode字符的字節
GLA:4字節INT
緯度:8字節雙
長:8字節雙
年份:4字節INT
阿卡:8字節雙
對象引用:12字節的對象引用的開銷

在100,000條記錄中,這還不到10MB。內存使用不會成爲問題。即使是最糟糕的情況下,一切都是一個字符串,總計少於20MB。

鑑於內存真的不會有問題,您應該可以使用Dictionary(Of String, Listing),其中Listing是您創建的用於存放這些記錄的類。