2010-07-17 82 views
2

任何人都可以帮我解决以下问题吗? 我需要永久保存我今天在数组中的内容,以便稍后使用这些数据进行计算。我在下面解释一个例子。如何在Java中存储(并读取)大型数组/地图/任何东西?

1,我生成一个很长的[] [],这对我的电脑RAM来说太大了。它是一行接一行地产生的。

2,我从我的long [] []中计算出一些东西,并将结果保存在一个double [] []中 - 对我的RAM来说也太大了。我不需要同时使用整个long [] [],因为同时在计算中使用了一小批行,并且在每个批处理中填充了double [] []中的一行。

3,我需要对double [] []进行排序,并做很多其他不重要的事情。

4,我重复步骤2和3的迭代次数很多(大于10000),这意味着我关心访问和排序的速度。我知道数组的大小,但显然我不能初始化它们,因为它们太大了,也因为它必须由int初始化(到目前为止,我只能运行“小”计算)。当然,我可以使用地图等,但我没有得到这个工作,我不明白我应该使用哪种(s)。我以前从未使用过地图/集合等。在后一种情况下,我可以使用数组中的一列作为键,因为它们是相同的(除了类型)。关键可能只是行号(表示为长)。

最好,我想解决这个问题,而不使用需要安装服务器的数据库,因为我的程序将被我以外的人使用。

我非常感激任何帮助和建议!

回答

1

要存储此数据,您可以使用netcdfhdf5。您可以获取并保存数组的子集。

+0

感谢您的建议! 他们都看起来很有前途。 – EvoMangan 2010-07-17 15:36:26

2

如果数组大于可以存储在您计算机的RAM中,那么很明显,您应该将数组的一部分或全部存储在磁盘上。

为此,您可以使用数据库。既然您不想安装服务器,则可以使用嵌入式数据库,如HSQLDB。您可以将HSQLDB配置为在应用程序终止时删除所有数据或将其保留以供将来使用。

另一种方法是使用自定义的Map实现,当数据大小增加超过您定义的阈值时,将数据刷新到辅助存储。为此,可以使用多种策略:FIFO,LIFO,LRU等。另外,无论何时需要访问映射的某个元素,您都可以从磁盘加载大量相邻元素(或者再次使用策略更适合您的使用情况)来减少过多的磁盘I/O。

+0

太棒了! 我将测试替代方案,以了解哪种方法是最有效的方法。我猜HSQLDB是最简单的。 非常感谢! – EvoMangan 2010-07-17 15:46:41

0

管理数据子集很可能是最好的解决方案。

但是,您应该问问自己,如果您使用正确的机器进行工作。您可以购买一台新的PC,Core 2 Duo 2.5 GHz,内存为4 Gb,售价为225英镑。你可以以380英镑的价格买8GB的四核心AMD处理器。您可以购买320 GB的16 GB内存。

我的观点是,你的时间有价值,你需要权衡现在和将来需要花费多少工作来节省一些内存和多少内存是值得的。

+0

呃......是的,电脑很便宜,特别是如果你(像我)只能接受一个“宽松”的主板,一捆电缆和Linux。尽管如此,人们总是会想要做更多的事情,还有更多......就我而言,我可以用我的电脑测试一些小东西,但只要我想分析更有趣的东西,RAM就不够了。 – EvoMangan 2010-07-20 21:52:43

+0

在这种情况下,您需要创建一个类似于数组的类,而是管理实际存储在内存中的“数组”的多少。基本上你需要一个长整数的get(int x,int y)方法。你有多少内存只是一个缓存问题。实现这一点的一种方法是使用内存映射文件。如果你这样做,你的数据大小会受到磁盘空间的限制,而磁盘空间比内存便宜(但速度并不快)! – 2010-07-21 20:28:33

相关问题