3

这是“需要了解有关问题的详细信息”:作为我正在编码的算法的一部分,它将大小为 3000X400 的矩阵作为输入。对于每一行,我需要创建一个方阵,即大小为 400x400。完成此操作后,我需要计算一个数字 R(i,j),其中 i,j 是为每一行生成的方阵 (400x400)。

如果您愿意,可以将其视为相关矩阵的计算。而不是相关性,我有自己的算法,可以对生成的方阵进行运算。我必须计算 0<=i<3000 和 j=i+1 到 3000 的 R(i,j)

这是我的问题:我动态分配一个指向方阵的 3D 数组,即我的 3D 数组是 (3000X400X400)。我没有足够的内存来执行此操作。对于较小的尺寸,即(800*400*400)左右,我的代码可以完美运行。但显然没有足够的内存将其扩展到 (3000*400) 的情况。我该怎么做呢?

一个(不太好的)解决方案:我不是计算每个方阵,而是计算 i 的方阵,然后当我循环 j = i+1 到 3000 时,我重新计算每个 j 的方阵然后计算 R(i,j)。显然,我正在重新计算一大堆矩阵,但至少它是有效的代码。

有没有你们能想到的更快的解决方案?我有足够的能力,定性的解决方案就足够了。我正在考虑计算方阵并将它们写入文件并在需要计算 R(i,j) 时读取它们 - 这会比我给出的重新计算解决方案更快吗?

感谢您的建议!!

使用写入文件并从中读取的解决方案要慢得多。任何非Hadoop的想法任何人?

4

1 回答 1

0

如果您有稀疏矩阵(很多零),您可能会考虑替代矩阵表示(请参阅https://en.wikipedia.org/wiki/Sparse_matrix#Storing_a_sparse_matrix以获得一些灵感)。

如果没有,有什么方法可以重写你的算法,以便你可以计算一些(甚至只是一个)方阵,使用它们,然后丢弃它们而不需要它们?在不知道您的应用程序的情况下,我真的不能说这是否可行。但这是一个想法。

否则,请考虑其他选项。您可能会考虑增加交换分区大小 (Linux) 或页面文件大小 (Windows)。我不确定它在 OSX 上叫什么,但我确信有办法做到这一点。基本上,这是操作系统在内存不足时将少量内存写入硬盘的空间。它有效地将您的值写入磁盘并稍后再次读取它们,但操作系统会处理它,它会更容易且效率更高。请记住,您可能需要一个 64 位系统才能执行此操作——您需要超过 3 GB 半的连续地址空间,而 32 位系统将很难提供这个。

如果一切都失败了,如果你有一个 64 位系统并且买得起,你总是可以买更多的内存。

祝你好运!

于 2013-06-21T01:44:28.450 回答