如何正确将大向量写入文件?

问题描述 投票:0回答:1

我遇到了一个问题,不知道如何调试或修复它。我想要做的是将计算出的数据向量保存到文件中,以便稍后加载它,避免每次程序启动时都需要重新计算。

问题是,这对于相对较小的数据集(例如,具有 100 万个元素的向量)运行良好,但当我尝试使用包含 3200 万个元素的完整数据集时,程序会卡住。我必须强行关闭它才能获取保存的文件,但它包含正确的数据量(2.304 GB,因为每个元素都是 72 字节)。所以,我不知道为什么程序无法继续,我必须强行关闭它才能获取我的文件。只是没有达到

outFile.close();

如果您对代码/数据有疑问,请询问。我会尽力提供信息。

// Function to save a vector of DataArray to a binary file
void saveDataToFile(const std::vector<KlineDataArray>& data, const std::string& filePath) 
{
    std::ofstream outFile(filePath, std::ios::binary);
    if (!outFile.is_open()) 
    {
        std::cerr << "Failed to open file for writing: " << filePath << '\n';
        return;
    }

    size_t dataSize{ data.size() };
    outFile.write(reinterpret_cast<const char*>(&dataSize), sizeof(size_t));
    outFile.write(reinterpret_cast<const char*>(data.data()), dataSize * sizeof(KlineDataArray));
    outFile.close();
}
c++ binaryfiles ofstream
1个回答
0
投票

std::ostream::write
的第二个参数是
std::streamsize
,其中...

是实现定义的有符号整数类型,用于表示 I/O 操作中传输的字符数或 I/O 缓冲区的大小。它用作

std::size_t
的带符号副本,类似于 POSIX 类型
ssize_t

在 32 位平台上,这相当于

int32_t
。 3200 万乘以 72 刚好足以将其溢出为负数...

我建议你写成 720 MB 左右的块,或者忘记 32 位的存在,直接编译为 64 位。

© www.soinside.com 2019 - 2024. All rights reserved.