0

为什么我的 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 卡上。

4

3 回答 3

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;
于 2013-06-05T00:58:27.827 回答
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);

看看是不是更快

于 2013-06-05T01:13:00.213 回答
0

我遇到了同样的问题,发现在每次循环迭代时打开附加/写入/关闭文件比在循环之前打开一次并在循环之后关闭一次要快。不知何故,每次关闭都会执行我们期望的刷新,但 flush() 不会。

于 2016-10-19T22:55:41.113 回答