在Java中管理大矩阵的正确方法

时间:2009-09-29 15:05:40

标签: java file memory matrix memory-management

我正在使用一个大矩阵(不稀疏),它包含大约10 ^ 10双。 当然我不能把它记在内存中,我只需要一行。

我想把它分成文件,每个文件1行(它需要很多文件),每次我需要一行时只读一个文件。你知道更有效的方法吗?

5 个答案:

答案 0 :(得分:1)

为什么要将其存储在不同的文件中?你不能使用单个文件吗?

您可以使用RandomAccessFile类中的函数来执行该文件的读取。

答案 1 :(得分:0)

所以,每个文件800KB,听起来像是一个很好的分工。当然,没有什么能阻止你使用一个巨大的文件。一个矩阵,至少有一个非稀疏的矩阵,可以被认为是一个固定长度记录的文件,使得随机访问变得微不足道。

如果你每行存储一个文件,我可能会建议制作一个对应于十进制数字的目录树,所以0/0/0/09/9/9/9

考虑某种方式......

  • 正在备份吗?你有高容量的备份媒体还是普通的?
  • 这个文件有变化吗?
  • 如果它确实发生变化并且已备份,它是一次更改还是更改本地化?

答案 2 :(得分:0)

如果您要将其保存在文件中,我相信序列化将节省空间/时间而不是将其存储为文本。

序列化双精度将它们存储为2个字节(加上序列化开销),这意味着在保存或加载文件时,您不必在字符串之间来回转换这些双精度数。

答案 3 :(得分:0)

这取决于你想要执行的算法,但我想在大多数情况下,每个文件包含一些正方形或矩形区域的表示会更好。

例如,矩阵乘法可以通过将矩阵分解为子矩阵来递归地完成。

答案 4 :(得分:0)

我建议使用像Ehcache这样的磁盘持久缓存。只需将其配置为根据需要在内存中保留尽可能多的矩阵片段,它将负责序列化。您所要做的就是决定碎片的方式。

我想到的另一种方法是使用Terracotta(顺便说一句,最近购买了Ehache)。获得一个大型网络连接堆非常棒,它可以轻松管理您的10 ^ 10双值而无需在代码中关注它。