【问题标题】:The right way to manage a big matrix in Java在 Java 中管理大矩阵的正确方法
【发布时间】:2009-09-29 15:05:39
【问题描述】:

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

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

【问题讨论】:

    标签: java file memory matrix memory-management


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      考虑一种或另一种方式...

      • 是否正在备份?你有大容量的备份媒体还是普通的东西?
      • 这个文件会改变吗?
      • 如果确实发生了更改并已备份,是一次全部更改还是本地更改?

      【讨论】:

      • 它没有改变,我的硬盘上有足够的可用空间
      • 如果它没有改变,我猜它也不需要备份。我想我同意 Aviator 的观点,看起来一个大文件就是要走的路。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          我想到的另一种方法是使用Terracotta(顺便说一句,它最近收购了 Ehache)。很高兴获得一个大型网络附加堆,它可以轻松管理您的 10^10 双精度值,而无需在代码中关心它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-10-11
            • 2012-01-30
            • 2019-09-20
            • 1970-01-01
            • 2016-02-01
            • 2016-03-19
            • 2015-02-18
            相关资源
            最近更新 更多