我遇到了一个问题,不知道如何调试或修复它。我想要做的是将计算出的数据向量保存到文件中,以便稍后加载它,避免每次程序启动时都需要重新计算。
问题是,这对于相对较小的数据集(例如,具有 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();
}
std::ostream::write
的第二个参数是std::streamsize
,其中...
是实现定义的有符号整数类型,用于表示 I/O 操作中传输的字符数或 I/O 缓冲区的大小。它用作
的带符号副本,类似于 POSIX 类型std::size_t
。ssize_t
在 32 位平台上,这相当于
int32_t
。 3200 万乘以 72 刚好足以将其溢出为负数...
我建议你写成 720 MB 左右的块,或者忘记 32 位的存在,直接编译为 64 位。