2011-04-19 68 views
1

我正在進行計算,現在生成的文本文件有288012413行,有4列。樣本列:存儲1萬億行信息的最佳方式

288012413; 4855 18668 5.5677643628300215 

該文件接近12 GB的。

這是不合理的。這是純文本。有沒有更高效的方法?我只需要大約3位小數,但是限制器會節省多少空間?

+0

如何壓縮? – Mehrdad 2011-04-19 03:12:08

+2

還挺取決於你以後計劃如何處理數據文件。 Gbs便宜 – Ben 2011-04-19 03:12:54

+0

它將不斷用作查找表。 – evanlivingston 2011-04-19 03:14:09

回答

1

好,

  • 第一列看起來很像一個行號 - 如果這是節約每行約11個字符的話,那麼你可能剛剛擺脫它。
  • 如果您只需要大約3位小數,則可以舍入/截斷最後一列,每行可能會保存另外12個字符。

I.e.你可以擺脫每行23個字符。該行長度爲40個字符,因此您可以近似減半文件大小。

如果你在最後一列做圓角,那麼你應該知道舍入誤差可能對你的計算產生的影響 - 如果最終結果需要精確到3 dp,那麼你可能想保留一些額外的數字的精度取決於計算的類型。

如果文件僅用於存儲結果,您可能還想研究壓縮文件。

1

將第4個字段減少到小數點後3位應該將文件減少到8GB左右。

1

如果只是陣列中的數據,我會去了解一下像HDF5:

http://www.hdfgroup.org/HDF5/

格式支持大多數語言中,有內置的壓縮​​和有良好的支持和廣泛的應用。

0

好吧,如果文件很大,並且您正在進行計算,需要對數字進行任何精確的處理,那麼您不需要限制器。這可能會造成更多的傷害而不是好處,並且對於12-15 GB的文件,這樣的問題將很難調試。我會使用一些壓縮工具,比如GZIP,ZIP,BlakHole,7ZIP或類似的東西來壓縮它。

此外,你使用什麼編碼?如果你只是存儲數字,你只需要ASCII碼。如果您使用的是Unicode編碼,那麼這將會使文件大小與ASCII大小成倍增長。

2

繼續使用MySQL數據庫

  • MSSQL Express有4GB
  • MS訪問的限制爲4 GB的限制

所以這些選項都出來了。我認爲通過使用像mysql或sSQLLite這樣的簡單數據庫而不進行索引是最好的選擇。無論如何,使用數據庫訪問數據的速度可能會更快,而且文件大小可能更小。

1

如果您打算將結果用作查找表,爲什麼要將ASCII用於數字數據?爲什麼不定義像這樣的結構:

struct x { 
    long lineno; 
    short thing1; 
    short thing2; 
    double value; 
} 

並將結構寫入二進制文件?由於所有的記錄都是已知的大小,以後通過它們很容易。

0

像AShelly,但更小。

假設線#'s爲連續...

結構X { 短thing1; short thing2; 空頭值; //你只說了3dp。所以存儲爲固定點n * 1000。你會得到dp }的2位數字}

保存在二進制文件中。 ()和write()是你的朋友。

文件將在1.7Gb左右變大(ish)。

0

最明顯的答案就是「拆分數據」。把它們放到不同的文件中,例如。每個文件1百萬行。 NTFS非常擅長處理每個文件夾中數十萬個文件。

然後,您已經得到了許多關於減小數據大小的答案。

接下來,爲什麼保持數據爲文本,如果你有一個固定大小的結構?將數字存儲爲二進制文件 - 這會減少更多空間(文本格式非常多)。

最後,DBMS可以成爲你最好的朋友。 NoSQL數據庫管理系統應該運行良好,雖然我不是這方面的專家,我不知道哪一個會保存萬億條記錄。

如果我是你,我會選擇固定大小的二進制格式,每個記錄佔用固定的(16-20?)個字節的空間。然後,即使我將數據保存在一個文件中,我也可以輕鬆確定需要從哪個位置開始讀取文件。如果你需要查找(比如說第1列)並且數據不是一直重新生成的,那麼可以通過生成後的查找鍵進行一次性排序 - 這會很慢,但是作爲一次性程序是可以接受的。

相關問題