我正在编写一些C ++代码(使用Eigen3矩阵库)来解决涉及巨大稀疏矩阵的凸优化问题。从文件中读取矩阵需要一分钟左右,而且我不想每次运行程序时都必须从文件中读取矩阵。 (我将调整我的优化算法中的参数,这涉及连续多次运行我的代码,而且我不想每次都要等待一分钟读取大矩阵。)
有没有办法让我可以在内存中保留这个大矩阵,同时我在代码中更改一些参数然后重新编译我的代码并再次运行它?
这种事情在Matlab中很容易,但我不知道它是如何在C ++中处理的(尽管这是一种常见的情况因此必须采用人们采用的标准方法)。
答案 0 :(得分:3)
当我在代码中更改某些参数然后重新编译我的代码并再次运行时,有没有办法让这个大矩阵保留在内存中?
AFAIK在进程未运行时保留进程的内存,然后任何操作系统都不支持“重新运行”进程。
您可以尝试:
但其中大部分(虽然有趣)实施起来非常复杂。
我将调整优化算法中的参数,这包括连续多次运行我的代码,我不想每次都要等待一分钟读取大矩阵。 / p>
如何从用户输入中获取这些参数而不是硬编码?这将允许您指定参数,运行代码,读入另一组参数,执行另一个运行,...而无需重新编译程序或停止并重新启动该过程。
答案 1 :(得分:3)
您的案例是mmap()
存在的完美示例:)
mmap()(适用于所有现代平台)允许您将磁盘上的文件视为常规RAM,使用" direct"随机读/写访问和操作系统支持的分页支持(非常类似于操作系统内存管理器交换时内存发生的情况)
当我在代码中更改某些参数然后重新编译我的代码并再次运行时,有没有办法让这个大矩阵保留在内存中?
嗯,是的......但是我觉得它的实现超出了你的项目范围。从本质上讲,这就是你要做的事情:
答案 2 :(得分:1)
您可以以二进制形式转储矩阵的数据 - 只需转储指向S.outerIndexPtr()
,S.innerIndexPtr()
,S.valuePtr()
的所有内容(如果它们可能在开头写入所有大小)并不总是一样的。)
要再次阅读,只需mmap
您的文件,然后从正确的起始地址创建Map<SparseMatrix>
。