【发布时间】:2009-09-29 15:05:39
【问题描述】:
我正在使用一个大矩阵(不稀疏),它包含大约 10^10 双倍。 当然我不能把它保存在内存中,我一次只需要 1 行。
我想将它拆分为文件,每个文件 1 行(它需要很多文件)并且每次需要一行时只需读取一个文件。你知道更有效的方法吗?
【问题讨论】:
标签: java file memory matrix memory-management
我正在使用一个大矩阵(不稀疏),它包含大约 10^10 双倍。 当然我不能把它保存在内存中,我一次只需要 1 行。
我想将它拆分为文件,每个文件 1 行(它需要很多文件)并且每次需要一行时只需读取一个文件。你知道更有效的方法吗?
【问题讨论】:
标签: java file memory matrix memory-management
为什么要将它存储在不同的文件中?你不能使用单个文件吗?
您可以使用 RandomAccessFile 类中的函数来读取该文件。
【讨论】:
所以,每个文件 800KB,听起来不错。当然,没有什么能真正阻止您使用一个巨大的文件。一个矩阵,至少像你的那样不是稀疏的,可以被认为是一个固定长度记录的文件,使随机访问变得微不足道。
如果您确实每行存储一个文件,我可能会建议创建一个对应于十进制数字的目录树,所以0/0/0/0 到9/9/9/9。
考虑一种或另一种方式...
【讨论】:
这取决于您要执行的算法,但我想在大多数情况下,每个文件包含一些正方形或矩形区域的表示会更好。
例如,矩阵乘法可以通过将矩阵分解为子矩阵来递归完成。
【讨论】:
如果您要将其保存在文件中,我相信将其序列化会比将其存储为文本节省空间/时间。
对双精度进行序列化会将它们存储为 2 个字节(加上序列化开销),这意味着您在保存或加载文件时不必在字符串之间来回转换这些双精度。
【讨论】:
我建议使用像Ehcache 这样的磁盘持久缓存。只需将其配置为在内存中保留尽可能多的矩阵片段,它将负责序列化。您所要做的就是决定碎片化的方式。
我想到的另一种方法是使用Terracotta(顺便说一句,它最近收购了 Ehache)。很高兴获得一个大型网络附加堆,它可以轻松管理您的 10^10 双精度值,而无需在代码中关心它。
【讨论】: