为什么我的fstream在将数据写入文件后需要30秒以上才能关闭?我写的越多,关闭所需的时间就越长。
fstream *writeReadStream = new fstream("/media/username/KODAK/file.bin", fstream::in | fstream::out | fstream::binary);
writeReadStream->seekg(0x100000);
char randomData[0x100000];
for (int i = 0; i < 0x270; i++)
writeReadStream->write(randomData, 0x100000);
writeReadStream->close();
delete writeReadStream;
调试时,我看到应用程序挂起close
电话。即使在printf
来电之前和之后未调试并呼叫close
,也需要很长时间才能达到第二个printf
。再一次,我写的越多,花费的时间越长。知道为什么吗?
这似乎只发生在闪存驱动器/ SD卡上。
答案 0 :(得分:0)
写入可能是缓冲的。关闭导致它刷新,因此您必须先等待它写入磁盘。尝试在for循环中放入一个刷新,然后查看关闭是否需要很长时间。
fstream *writeReadStream = new fstream("/home/username/Desktop/file.bin", fstream::in | fstream::out | fstream::binary);
writeReadStream->seekg(0x100000);
char randomData[0x100000];
for (int i = 0; i < 0x270; i++)
{
writeReadStream->write(randomData, 0x100000);
writeReadStream->flush();
}
writeReadStream->close();
delete writeReadStream;
答案 1 :(得分:0)
您正在撰写大量数据。您的问题可能是由于缓冲。如果我是你,我会尝试无缓冲的C api:
FILE *fd = std::fopen("/home/username/Desktop/file.bin", "w");
if (!fd) {
// handle error
}
std::setvbuf(fd, NULL, _IONBF, 0);
if (0 != std::fseek(fd, 0x100000, SEEK_SET)) {
// handle error
}
for (int i = 0; i < 0x270; i++) {
if (1 != std::fwrite(randomData, 0x100000, 1, fd)) {
// handle error
}
}
close(fd);
看看它是否更快
答案 2 :(得分:0)
我遇到了同样的问题,发现在每次循环迭代中打开 - 追加/写/关闭文件比在循环之后打开一次和关闭一次更快。不知何故,每个关闭执行我们期望的刷新,但flush()不会。