我们有一个包含大量float
数据(大约80MB)的二进制文件。我们需要在Java应用程序中处理它。数据来自医疗扫描仪。一个文件包含来自一个Rotation
的数据。一个Rotation
包含960 Views
。一个View
包含16个Rows
,一个Rows
包含1344 Cells
。这些数字(他们的关系)是固定的。
我们需要将所有浮点数读入我们的应用程序,其代码结构反映了上述Rotation-view-row-cell
的结构。
我们现在正在做的是使用float[]
来保存Cells
的数据,然后使用ArrayList
来Rotation
,View
和Row
保存他们的数据。
我有两个问题:
答案 0 :(得分:2)
假设您没有对数据进行更改(添加更多视图等),为什么不将所有内容放在一个大数组中? ArrayLists的重点是你可以增长和缩小它们,这里你不需要它们。您可以编写访问方法以获取给定视图,旋转等的正确单元格。
使用数组数组是一个更好的主意,就像系统正在弄清楚如何为你访问什么,它就像单个数组一样快。
Michael是对的,你需要缓冲输入,否则你将对每个字节进行文件访问操作,你的表现会很糟糕。
如果您希望尽可能坚持当前的方法,可以通过将其容量设置为它们所持有的元素数量来最小化ArrayLists使用的内存。否则,它们会保留许多插槽,期望您添加更多插槽。
答案 1 :(得分:2)
DataInputStream
(及其readFloat()
方法)包装FileInputStream
,可能包含e BufferedInputStream
(尝试缓冲区是否有助于提高性能)。< / LI>
答案 2 :(得分:1)
您当前的方法是否有任何特定的性能/使用问题?
根据您提供的信息,我唯一可以建议的是尝试将View表示为行[] [] [] [
答案 3 :(得分:1)
对于数据加载:
DataInputStream应该运行良好。但请确保将基础FileInputStream包装在BufferedInputStream中,否则您将面临为每个浮动执行I / O操作的风险,这会导致性能下降。
保存数据的几个选项:
答案 4 :(得分:1)
我还认为您可以将所有数据结构放入float[][][]
(与 Nathan Hughes 建议相同)。你可以有一个方法来读取你的文件并返回float[][][]
,其中第一个维度是视图的维度(960),第二个维度是行(16),第三个维度是单元格(1344) :如果这些数字是修复的,你最好使用这种方法:你节省内存,而且速度更快。
答案 5 :(得分:0)
80 MB应该不是那么多你需要担心的数据。我真的建议:
答案 6 :(得分:0)
我知道您正在寻找上述商店数据的有效方式,但您提到的尺寸不是很大我建议您查看Huge Collections.