2013-10-23 52 views
1

基準線 - 我有10,000條目的CSV數據。我將它保存爲1個csv文件並一次加載。在驅動器上存儲數據的最有效方式

替代 - 我有10,000個條目的CSV數據。我將它保存爲10,000個CSV文件並單獨加載。

大概這種計算效率低了多少。我對記憶的擔憂並不是很感興趣。另一種方法的目的是因爲我經常需要訪問數據的子集,並且不想讀取整個數組。

我正在使用python。

編輯:如果需要,我可以使用其他文件格式。

Edit1:SQLite獲勝。與我之前做的事情相比,令人驚訝的簡單和高效。

+0

你能以其他格式存儲該數據嗎? _所有其他格式? –

+1

您的瓶頸將是磁盤訪問。計算將不受您的選擇影響。 – user2357112

+5

10,000個文件?讀取整個陣列會比這更好。考慮數據庫解決方案。 – 2013-10-23 03:22:09

回答

6

SQLite是爲你的應用的理想解決方案。

只需將CSV文件導入到SQLite數據庫表(它將成爲單個文件),然後根據需要添加索引。

要訪問您的數據,請使用python sqlite3庫。您可以使用this tutorial來了解如何使用它。

與許多其他解決方案相比,SQLite將成爲本地選擇部分數據集的最快方式 - 當然比訪問10000個文件要快得多。另請閱讀this answer,它解釋了SQLite如此優秀的原因。

+3

IMO這是手中最好的選擇。添加或編輯條目要容易得多,並且數據檢索將比嘗試直接使用CSV更健壯。 – redFIVE

+1

其次,我要提醒的是,如果您的CSV行數量非常大,您可能需要移動到像PostgreSQL這樣的「真實」數據庫。 –

1

我會將所有行寫入一個文件。對於10,000行,這可能是不值得的,但是你可以將所有的行填充到相同的長度 - 比如說1000字節。

然後很容易seek到第n行,只是多個N-通過線路長度

+0

這種方法有很多問題。如果1000字節是不夠的?如果大多數記錄只佔用100個字節而只有幾千個字節呢?你會浪費90%的磁盤空間嗎?如果你決定增加到2000字節 - 如何重新加載數據?如果您需要對數據進行排序或獲取一些子集,會怎樣?像SQLite這樣的真正的數據庫真的是唯一的選擇 – mvp

+0

@mvp,當然sqlite更靈活,但靈活性需要付出代價。對於需要隨機訪問連續塊行的特殊情況,sqlite正在做一些額外的工作。 –

0

如果僅僅因爲文件的數據可能在您的磁盤驅動器周圍碎片化,10,000個文件的加載和訪問速度將比一個文件慢,因此訪問它需要的訪問次數要多於訪問一個文件的內容,通常會盡可能按順序存儲。尋找時間對旋轉介質來說是一個巨大的放緩,因爲你的程序必須等待驅動器磁頭重新定位,這可能需要幾毫秒。 (緩慢尋找時間對於SSD來說不是問題,但即使如此,操作系統仍需要處理10,000個文件元數據的開銷)。另外,對於單個文件,操作系統可以通過預讀緩衝來加快速度(因爲它可以合理地假設如果您閱讀文件的一部分,您很可能會很快閱讀下一部分內容)。有了多個文件,操作系統無法做到這一點。

我的建議(如果你不想走SQLite路線)將使用一個CSV文件,並且(如果可能)用空格填充CSV文件的所有行,以便它們都具有長度相同。例如,假設您在寫出CSV文件時確保文件中的所有行長度均爲80個字節。然後讀取文件的第(n)行變得相對快速和容易:

myFileObject.seek(n*80) 
theLine = myFileObject.read(80) 
相關問題