簡體   English   中英

如何處理大量浮點數據?

[英]how to handle large amount of float data?

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

我們需要將所有浮點數讀入我們的應用程序,其代碼結構反映了關於Rotation-view-row-cell上述結構。

我們現在正在做的是使用float[]來保存Cells數據,然后使用ArrayList for RotationViewRow來保存它們的數據。

我有兩個問題:

  1. 如何快速填充Cell數據(將浮點數讀入浮點數[])?
  2. 你有更好的想法來保存這些數據嗎?

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

使用數組數組是一個更好的主意,這樣系統就可以確定如何為您訪問什么,它就像單個數組一樣快。

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

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

  1. 使用DataInputStream (及其readFloat()方法)包裝FileInputStream ,可能在其間使用e BufferedInputStream (嘗試緩沖區是否有助於提高性能)。
  2. 您的數據結構看起來很好。

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

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

對於數據加載:

DataInputStream應該可以正常工作。 但請確保將基礎FileInputStream包裝在BufferedInputStream中,否則您將面臨為每個可能會降低性能的浮動執行I / O操作的風險。

保存數據的幾個選項:

  • (非常簡單地)最節省內存的方法是將整個數組存儲在大型float []上,並根據需要計算偏移量。 使用起來有點難看,但如果您在整個集合中進行大量計算或處理循環,則可能有意義。
  • 最“OOP”的方式是為Rotation,View,Row和Cell提供單獨的對象。 但是將每個單元作為一個單獨的對象是非常浪費的,甚至可能會打破你的內存限制。
  • 您可以使用帶有float [1344]的嵌套ArrayLists來表示每行中單元格的最低級別數據。 我明白這就是你現在正在做的事情 - 事實上我覺得這是一個不錯的選擇。 與整體數據大小相比,ArrayLists的開銷不會太大。
  • 最后一個選項是使用float [rotationNum] [rowNum] [cellNum]來表示每個旋轉。 比ArrayLists更有效,但數組操作通常不太好。 但是,如果正如您所說,數組大小將始終固定,這似乎是一個非常好的選擇。 我可能自己選擇這個選項。

我還認為你可以將所有數據結構放入float[][][] (與Nathan Hughes建議的相同)。 你可以有一個方法來讀取你的文件並返回一個float[][][] ,其中第一個維度是視圖的維度(960),第二個維度是行(16),第三個維度是細胞的維度( 1344):如果這些數字是修復,你最好使用這種方法:你節省內存,而且速度更快。

80 MB應該不是那么多你需要擔心的數據。 我真的建議:

  • 創建Java包裝器對象,表示您擁有的數據的最邏輯結構/層次結構;
  • 無論如何,確保您每16K左右的數據只進行一次實際的“原始”I / O調用(所以是一個InputStream.read()或等效的) - 例如,您可以讀入16K / 32K字節包含在ByteBuffer中的數組,用於拉出浮點數,或者您需要的數據;
  • 如果你真的遇到這種方法的性能問題,試着找出,而不是第二次猜測,實際上是什么性能問題。

我知道你正在尋找上面描述的商店數據的有效方式,雖然你提到的尺寸不是很大我建議你看看巨大的收藏品。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM