2013-02-07 12 views
3

我有25000輛花車(,分隔)文件,大約有10萬這樣的行。該文件的行看起來像:有效的方法來壓縮/串行/操縱大量數據的

1689.97,-9643.39,-82082.1,9776.09,-33974.84,-67247.38,32997.34,72811.53,31642.87,-949.6,9340.68,-85854.48,-17705.36,187.74,-3002.6,-35812.21,37382.32,22770.78,40893.09,45743.99,-6500.92,26243.85,13975.95,0,56669.47,-25865.36,-17066.78,26788.57,0,-36554.86,-3687.19,18933.93 

我有一個2部分的問題。

  1. 有沒有一種方法(在Java或Python中)有效地壓縮數據而不影響性能。壓縮將每天進行一次,但數據必須經常讀取。
  2. 可以將數據在壓縮形式被操縱例如我想在沒有解壓縮的情況下聚集前10行的前10列。這樣我就不必擔心頻繁讀取壓縮數據。其中一個挑戰是將25,000個字符串轉換爲浮點數以便添加。

我看了看gzipzcat,他們是不錯的選擇。但我想找到一些壓縮或序列化算法來存儲數據通過Java/Python並執行讀取而不解壓縮。

+1

Lookie:http://stackoverflow.com/questions/87679/advice-on-handling-large-data-volumes – David

+0

該文件必須是一個ASCII文件,或者你可以考慮有一個二進制文件,而不是?浮標是單精度還是雙精度?如果它們是單精度的,那麼最簡單的事情就是將浮點數的二進制表示存儲在文件中。 – Bakuriu

+0

要回復對問題所做的更改:1)標籤不屬於標題,因此「在java中」不應該在那裏提及。有一個標籤(和OP使用它)。另外,我給出的格式是正確的。 Op想要一個enumerand列表,現在已經有了,而且這個龐大的行必須顯示爲代碼。 – Bakuriu

回答

0

使用DataOutPutStream和writeFloat和你不需要用逗號分隔符

+0

這並不意味着生成的文件會更小的方法。如果ASCII表示較小,文件大小可能會增加,或者可能會減少一個小的因子,則浮動可能需要最多8個字節才能表示。 – Bakuriu

+0

'DataOutputStream類出來=
新DataOutputStream類(新FileOutputStream中( 「out.dat」));'
\t \t \t'// out.writeFloat(0F); // 4bytes'
\t \t \t'//out.writeChars("0,「); // 4 bytes'
\t \t \t'out.close();'
在最壞的情況,是相同的尺寸 –

+0

否'0'是* 2個*字節,因爲它是ASCII。另外,如果它們是雙精度的,那麼'12345.67'需要8個字節,這與它的二進制表示相同。尺寸減小的可能性很大,但它取決於ASCII中浮點數的表示。另外,gzip ASCII文件會將其大小減小一半,而二進制文件可能會被壓縮較小的量(這也不能保證最後的二進制表示會更小)。 – Bakuriu

0

而不是寫出來作爲文本的,你可以把它寫出來的字節。你將不得不將其轉換爲/從premitives到字節數組,但我不認爲這太難。我知道你可以使用Float.floatToRawIntBits()轉換成int和Float.intBytesToFloat()去從INT回來。將一個int轉換爲一個byte []只是一個稍微改變的問題。

相關問題