从内存到硬盘驱动器(C/ c++)读取和读取整个数组

Read-out and Read-in Entire Arrays from/to Memory to/from Hard Drive (in C/C++)

本文关键字:读取 数组 c++ 内存 硬盘驱动器      更新时间:2023-10-16

我想这个问题以前已经问过了,但不幸的是,我还没有找到任何答案。如果我漏掉了一些,很抱歉。在这种情况下,最好能给我指出这些。谢谢。

我有一个程序,它使用了许多大的(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语言中,您将打开一个文件,将该文件映射到您的"数组",然后对该内存区域进行操作。

如果你的数组增长或收缩,会有一些细微的差别,但总的来说,这就是我要做的。