我正在進行計算,現在生成的文本文件有288012413行,有4列。樣本列:存儲1萬億行信息的最佳方式
288012413; 4855 18668 5.5677643628300215
該文件接近12 GB的。
這是不合理的。這是純文本。有沒有更高效的方法?我只需要大約3位小數,但是限制器會節省多少空間?
我正在進行計算,現在生成的文本文件有288012413行,有4列。樣本列:存儲1萬億行信息的最佳方式
288012413; 4855 18668 5.5677643628300215
該文件接近12 GB的。
這是不合理的。這是純文本。有沒有更高效的方法?我只需要大約3位小數,但是限制器會節省多少空間?
好,
I.e.你可以擺脫每行23個字符。該行長度爲40個字符,因此您可以近似減半文件大小。
如果你在最後一列做圓角,那麼你應該知道舍入誤差可能對你的計算產生的影響 - 如果最終結果需要精確到3 dp,那麼你可能想保留一些額外的數字的精度取決於計算的類型。
如果文件僅用於存儲結果,您可能還想研究壓縮文件。
將第4個字段減少到小數點後3位應該將文件減少到8GB左右。
好吧,如果文件很大,並且您正在進行計算,需要對數字進行任何精確的處理,那麼您不需要限制器。這可能會造成更多的傷害而不是好處,並且對於12-15 GB的文件,這樣的問題將很難調試。我會使用一些壓縮工具,比如GZIP,ZIP,BlakHole,7ZIP或類似的東西來壓縮它。
此外,你使用什麼編碼?如果你只是存儲數字,你只需要ASCII碼。如果您使用的是Unicode編碼,那麼這將會使文件大小與ASCII大小成倍增長。
繼續使用MySQL數據庫
所以這些選項都出來了。我認爲通過使用像mysql或sSQLLite這樣的簡單數據庫而不進行索引是最好的選擇。無論如何,使用數據庫訪問數據的速度可能會更快,而且文件大小可能更小。
如果您打算將結果用作查找表,爲什麼要將ASCII用於數字數據?爲什麼不定義像這樣的結構:
struct x {
long lineno;
short thing1;
short thing2;
double value;
}
並將結構寫入二進制文件?由於所有的記錄都是已知的大小,以後通過它們很容易。
像AShelly,但更小。
假設線#'s爲連續...
結構X { 短thing1; short thing2; 空頭值; //你只說了3dp。所以存儲爲固定點n * 1000。你會得到dp }的2位數字}
保存在二進制文件中。 ()和write()是你的朋友。
文件將在1.7Gb左右變大(ish)。
最明顯的答案就是「拆分數據」。把它們放到不同的文件中,例如。每個文件1百萬行。 NTFS非常擅長處理每個文件夾中數十萬個文件。
然後,您已經得到了許多關於減小數據大小的答案。
接下來,爲什麼保持數據爲文本,如果你有一個固定大小的結構?將數字存儲爲二進制文件 - 這會減少更多空間(文本格式非常多)。
最後,DBMS可以成爲你最好的朋友。 NoSQL數據庫管理系統應該運行良好,雖然我不是這方面的專家,我不知道哪一個會保存萬億條記錄。
如果我是你,我會選擇固定大小的二進制格式,每個記錄佔用固定的(16-20?)個字節的空間。然後,即使我將數據保存在一個文件中,我也可以輕鬆確定需要從哪個位置開始讀取文件。如果你需要查找(比如說第1列)並且數據不是一直重新生成的,那麼可以通過生成後的查找鍵進行一次性排序 - 這會很慢,但是作爲一次性程序是可以接受的。
如何壓縮? – Mehrdad 2011-04-19 03:12:08
還挺取決於你以後計劃如何處理數據文件。 Gbs便宜 – Ben 2011-04-19 03:12:54
它將不斷用作查找表。 – evanlivingston 2011-04-19 03:14:09