2011-05-11 38 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.