从内存到硬盘驱动器(C/ c++)读取和读取整个数组
Read-out and Read-in Entire Arrays from/to Memory to/from Hard Drive (in C/C++)
我想这个问题以前已经问过了,但不幸的是,我还没有找到任何答案。如果我漏掉了一些,很抱歉。在这种情况下,最好能给我指出这些。谢谢。
我有一个程序,它使用了许多大的(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语言中,您将打开一个文件,将该文件映射到您的"数组",然后对该内存区域进行操作。
如果你的数组增长或收缩,会有一些细微的差别,但总的来说,这就是我要做的。
- 当我在 CLion 中读取数组中的 txt 文件时C++编码问题
- For 循环在尝试读取数组 c++ 时程序崩溃
- 从文件中读取数组没有给出正确的值?
- (C/C++)fscanf_s从txt文件以字符形式读取数组时缺少整数参数错误
- C++:无法读取数组中的内容
- 读取数组的第一个元素还是第 4000 个元素更快?
- 为什么并行读取数组会导致内存泄漏?
- 读取数组中每个对象的所有键值对
- C++ 从指定范围内的文件中读取数组
- MPI_Get仅从共享内存区域读取数组的第一个元素
- 如何使用指针函数编写/读取数组
- 程序仅读取数组中 6 个值中的 4 个
- ARDUINO LCD:通过读取数组生成导航菜单
- 如何从 Arduino 库中读取数组
- 尝试创建一个读取数组并打印质数的程序
- 因为每个循环都读取数组错误
- 在 Linux 上使用 Getenv 在 C++ 中读取数组环境变量
- 如何在c++中读取数组中的输入文件
- 动态设置数组大小并从文本文件中读取数组值
- 从boost::p roperty_tree读取数组显示为空白