在多个C ++程序运行中保持内存中的巨大矩阵

时间:2017-04-08 23:39:48

标签: c++

我正在编写一些C ++代码(使用Eigen3矩阵库)来解决涉及巨大稀疏矩阵的凸优化问题。从文件中读取矩阵需要一分钟左右,而且我不想每次运行程序时都必须从文件中读取矩阵。 (我将调整我的优化算法中的参数,这涉及连续多次运行我的代码,而且我不想每次都要等待一分钟读取大矩阵。)

有没有办法让我可以在内存中保留这个大矩阵,同时我在代码中更改一些参数然后重新编译我的代码并再次运行它?

这种事情在Matlab中很容易,但我不知道它是如何在C ++中处理的(尽管这是一种常见的情况因此必须采用人们采用的标准方法)。

3 个答案:

答案 0 :(得分:3)

  

当我在代码中更改某些参数然后重新编译我的代码并再次运行时,有没有办法让这个大矩阵保留在内存中?

AFAIK在进程未运行时保留进程的内存,然后任何操作系统都不支持“重新运行”进程。

您可以尝试:

  • 改进矩阵的阅读代码(或存储的表示,如chtz建议的那样)。
  • 通过辅助进程保持矩阵加载,并使用进程间通信从包含“主代码”的进程中处理它(然后可以(重新)启动并随意停止)。
  • 尝试实现某种"hot swapable module" /热码重新加载。

但其中大部分(虽然有趣)实施起来非常复杂。

  

我将调整优化算法中的参数,这包括连续多次运行我的代码,我不想每次都要等待一分钟读取大矩阵。 / p>

如何从用户输入中获取这些参数而不是硬编码?这将允许您指定参数,运行代码,读入另一组参数,执行另一个运行,...而无需重新编译程序或停止并重新启动该过程。

答案 1 :(得分:3)

您的案例是mmap()存在的完美示例:)

mmap()(适用于所有现代平台)允许您将磁盘上的文件视为常规RAM,使用" direct"随机读/写访问和操作系统支持的分页支持(非常类似于操作系统内存管理器交换时内存发生的情况)

  

当我在代码中更改某些参数然后重新编译我的代码并再次运行时,有没有办法让这个大矩阵保留在内存中?

嗯,是的......但是我觉得它的实现超出了你的项目范围。从本质上讲,这就是你要做的事情:

  1. 创建一个" loader"这会将数据加载到内存中并使内存“共享”#34; (可用于其他流程)
  2. 启动您的代码,为其提供内存的句柄(或地址,具体取决于您的平台),以便它可以请求访问它
  3. 完成后,您的代码将退出,从该共享内存中分离,这将继续由加载程序进程保存,以便下次启动您的代码

答案 2 :(得分:1)

您可以以二进制形式转储矩阵的数据 - 只需转储指向S.outerIndexPtr()S.innerIndexPtr()S.valuePtr()的所有内容(如果它们可能在开头写入所有大小)并不总是一样的。)

要再次阅读,只需mmap您的文件,然后从正确的起始地址创建Map<SparseMatrix>