如何处理大量浮点数据?

时间:2011-05-11 14:33:39

标签: java

我们有一个包含大量float数据(大约80MB)的二进制文件。我们需要在Java应用程序中处理它。数据来自医疗扫描仪。一个文件包含来自一个Rotation的数据。一个Rotation包含960 Views。一个View包含16个Rows,一个Rows包含1344 Cells。这些数字(他们的关系)是固定的。

我们需要将所有浮点数读入我们的应用程序,其代码结构反映了上述Rotation-view-row-cell的结构。

我们现在正在做的是使用float[]来保存Cells的数据,然后使用ArrayListRotationViewRow保存他们的数据。

我有两个问题:

  1. 如何快速填充Cell数据(将float浮动到float []中)?
  2. 你有更好的想法来保存这些数据吗?

7 个答案:

答案 0 :(得分:2)

假设您没有对数据进行更改(添加更多视图等),为什么不将所有内容放在一个大数组中? ArrayLists的重点是你可以增长和缩小它们,这里你不需要它们。您可以编写访问方法以获取给定视图,旋转等的正确单元格。

使用数组数组是一个更好的主意,就像系统正在弄清楚如何为你访问什么,它就像单个数组一样快。

Michael是对的,你需要缓冲输入,否则你将对每个字节进行文件访问操作,你的表现会很糟糕。

如果您希望尽可能坚持当前的方法,可以通过将其容量设置为它们所持有的元素数量来最小化ArrayLists使用的内存。否则,它们会保留许多插槽,期望您添加更多插槽。

答案 1 :(得分:2)

  1. 使用DataInputStream(及其readFloat()方法)包装FileInputStream,可能包含e BufferedInputStream(尝试缓冲区是否有助于提高性能)。< / LI>
  2. 您的数据结构看起来很好。

答案 2 :(得分:1)

您当前的方法是否有任何特定的性能/使用问题?

根据您提供的信息,我唯一可以建议的是尝试将View表示为行[] [] [] [

答案 3 :(得分:1)

对于数据加载:

DataInputStream应该运行良好。但请确保将基础FileInputStream包装在BufferedInputStream中,否则您将面临为每个浮动执行I / O操作的风险,这会导致性能下降。

保存数据的几个选项:

  • (非常简单地)最节省内存的方法是将整个数组存储在大型float []上,并根据需要计算偏移量。使用起来有点难看,但如果您在整个集合中进行大量计算或处理循环,则可能有意义。
  • 最“OOP”的方式是为Rotation,View,Row和Cell提供单独的对象。但是将每个单元作为一个单独的对象非常浪费,甚至可能会限制你的内存限制。
  • 您可以使用带有float [1344]的嵌套ArrayLists来表示每行中单元格的最低级别数据。我明白这就是你现在正在做的事情 - 事实上我觉得这是一个不错的选择。与整体数据大小相比,ArrayLists的开销不会太大。
  • 最后一个选项是使用float [rotationNum] [rowNum] [cellNum]来表示每个旋转。比ArrayLists更有效,但数组操作通常不太好。但是,如果正如您所说,数组大小将始终固定,这似乎是一个非常好的选择。我可能会自己选择这个选项。

答案 4 :(得分:1)

我还认为您可以将所有数据结构放入float[][][](与 Nathan Hughes 建议相同)。你可以有一个方法来读取你的文件并返回float[][][],其中第一个维度是视图的维度(960),第二个维度是行(16),第三个维度是单元格(1344) :如果这些数字是修复的,你最好使用这种方法:你节省内存,而且速度更快。

答案 5 :(得分:0)

80 MB应该不是那么多你需要担心的数据。我真的建议:

  • 创建Java包装器对象,表示您拥有的数据的最逻辑结构/层次结构;
  • 这样或那样,确保你每16K左右的数据只进行一次实际的“原始”I / O调用(所以是一个InputStream.read()或等价的) - 例如你可以读入一个包含在ByteBuffer中的16K / 32K字节数组,以便拉出浮点数,或者你需要的任何数据;
  • 如果您确实遇到这种方法的性能问题,请尝试识别,而不是第二次猜测,实际上是什么性能问题。

答案 6 :(得分:0)

我知道您正在寻找上述商店数据的有效方式,但您提到的尺寸不是很大我建议您查看Huge Collections.