我想这个问题以前已经问过了,但不幸的是,我还没有找到任何答案。如果我漏掉了一些,很抱歉。在这种情况下,最好能给我指出这些。谢谢。
我有一个程序,它使用了许多大的(2维和3维,但在内存中是连续的)数组,如array2[t][x]
和array3[t][x][y]
。我的程序一步一步地填充这些数组,即在某个点计算给定t的所有x(或x和y),然后存储在array2[x][t]
(或array3[t][x][y]
)中。由于程序运行在一个集群上,它已经实现了运行时间限制,我想读出数组到硬盘至少在墙时间结束之前,以便在重新启动程序时再次将它们读取到相同的数组中,以便这些第一个条目不必再次计算,但可以立即再次使用(即所有条目必须再次在同一地点)。我不需要人类可读形式的数据,所以它也可以保存为二进制格式。
那么,在C(或c++)中执行这些过程(即读出和读入)的最佳(也许是最有效的)方法是什么?由于数组是一步一步地填充的,我想在每一步之后(或者每隔10步左右)执行读出操作可能比较好。(fstream
也许可以考虑一下吗?)
我很高兴听到任何建议。非常感谢!
编辑:也许要澄清:我不是问数组如何存储在内存中,而是如何从内存读取和写入它们从/到硬盘。感谢到目前为止的建议!
你可以选择武器!如果数据是连续的,则可以将其作为平面1D数组写入和读取到文件中。
然后对于你将要使用的流,你可以选择你是想写文本(可读的,这样你就可以手动控制/编辑值)还是二进制。
编辑:这里有一个使用二进制方法的小书写函数(流必须以二进制打开)
template <typename T>
void write_array_bin(ofstream &ofs, T *array, int number_elements)
{
ofs.write(reinterpret_cast<char*>(&number_elements), sizeof(number_elements));
ofs.write(reinterpret_cast<char*>(array), sizeof(T)*number_elements);
}
和一个读取函数,它返回一个包含所有值的1D数组(动态分配):
template <typename T>
T* read_array_bin(ifstream &ifs, size_t& number_elements)
{
T *array = nullptr;
ifs.read(reinterpret_cast<char*>(&number_elements), sizeof(number_elements));
if (ifs) {
array = new T[number_elements];
if (!ifs.read(reinterpret_cast<char*>(array), sizeof(T)*number_elements)) {
throw istream::failure("Incomplete read/inconsistent objects");
}
}
return array;
}
它是基于模板的,所以你可以使用它与int, float,或其他任何。这里有一个使用的小例子:
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
size_t sizec = 0;
{
write_array_bin<int>(ofstream("test2.txt", ios::binary), a, 10);
} // bloc, so that the anonymous ofstream is closed
int *c = read_array_bin<int>(ifstream("test2.txt", ios::binary), sizec);
我以前贴过文本版本。但是重读你的问题,二进制看起来更合适,性能更高,在一次操作中读取/写入所有数据。
如果您在linux上运行,我会使用mmap,如果在windows上运行则使用FileMapping。在C语言中,您将打开一个文件,将该文件映射到您的"数组",然后对该内存区域进行操作。
如果你的数组增长或收缩,会有一些细微的差别,但总的来说,这就是我要做的。