2011-05-11 19 views
3

我們有一個二進制文件,其中包含大量的float數據(大約80MB)。我們需要在我們的Java應用程序中處理它。數據來自醫療掃描儀。一個文件包含來自一個Rotation的數據。一個Rotation包含960 Views。一個View包含16個Rows和一個Rows包含1344個Cells。這些數字(他們的關係)是固定的。如何處理大量的浮點數據?

我們需要讀取所有漂浮在我們的應用程序中,代碼結構反映了上述結構約Rotation-view-row-cell

我們現在正在做的是使用float[]以保持Cells,然後使用ArrayListRotationView和舉行他們的數據。

我有兩個問題:

  1. 如何填充單元格數據(讀花車到我們的浮法[])快?
  2. 你有更好的主意來保存這些數據嗎?

回答

1

對於數據加載:

DataInputStream應該運行良好。但是請確保將底層FileInputStream包裝在BufferedInputStream中,否則可能會對每個可能導致性能下降的float進行I/O操作。

用於保持數據的幾個選項:

  • 的(非常輕微)最存儲器高效的方式將整個數組存儲在大漂浮[],並且根據需要計算的偏移到它。有點難以使用,但是如果你在整個集合上做了大量的計算或處理循環,這可能是有意義的。
  • 最「OOP」的方式是爲旋轉,視圖,行和單元分開對象。但將每個細胞作爲單獨的物體是非常浪費的,甚至可能會打擊你的記憶極限。
  • 您可以使用嵌套的ArrayLists和float [1344]來表示每行中單元格的最低級別數據。我明白這是你現在正在做的事 - 事實上我認爲這是一個不錯的選擇。 ArrayLists的開銷與整體數據大小相比不會太大。
  • 最後一個選項是使用float [rotationNum] [rowNum] [cellNum]來表示每次旋轉。比ArrayLists更有效一些,但數組通常不太好處理。不過,如果像你說的那樣,這個數組的大小總是固定不變的。我可能會自己選擇這個選項。
2

假設您不對數據進行更改(添加更多視圖等),爲什麼不把所有內容放在一個大數組中? ArrayLists的要點是你可以增長和縮小它們,這裏你不需要。您可以編寫訪問方法以獲取給定視圖,旋轉等的正確單元格。

使用數組數組是一個更好的主意,這樣系統就可以確定如何訪問您的內容,快速作爲單個陣列。

邁克爾是對的,你需要緩衝輸入,否則你會爲每個字節做一個文件訪問操作,你的性能將會很糟糕。

如果您想盡可能地堅持使用當前的方法,您可以通過將ArrayLists的容量設置爲其容納的元素數量來最小化ArrayLists使用的內存。否則,他們會保留一定數量的插槽,期待您添加更多插槽。

2
  1. 使用一個DataInputStream(及其readFloat()法)包裝一FileInputStream,可能隨e BufferedInputStream之間(嘗試緩衝區是否有助於提高性能或沒有)。
  2. 你的數據結構看起來很好。
1

您對當前的方法有任何特定的性能/使用問題嗎?

根據您提供的信息,我可以提出的唯一建議是嘗試將視圖表示爲行和單元格的float [] []。

1

我也認爲你可以把你所有的數據結構到float[][][](同內森·休斯建議)。你可以有一個方法來讀取你的文件並返回一個float[][][],其中第一維是視圖(960),第二維是行(16),第三維是單元格(1344):如果這些數字已修復,您最好使用這種方法:您節省內存,速度更快。

0

80 MB不應該是那麼多的數據,你需要擔心如此之多。我真的建議:

  • 創建Java包裝對象,表示您擁有的數據的最合理的結構/層次結構;
  • 以某種方式確保您每16K或更多的數據只進行一次實際的「原始」I/O調用(例如InputStream.read()或等價物) - 例如,你可以讀入一個16K/32K字節的數組,這個數組被包裝在一個ByteBuffer中,用於提取浮點數或者你需要的任何數據;
  • 如果您實際上遇到此方法的性能問題,請嘗試確定(而不是事先猜測)該性能問題的實際情況。
0

據我所知,你正在尋找你上述存儲數據的有效方法,但你提到的尺寸不是非常巨大的,我建議你有看Huge Collections.