[英]Taking a long time to close fstream
將數據寫入文件后,為什么我的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
調用上。 即使在close
調用之前和之后都沒有調試和調用printf
的情況下,到達第二個printf
也會花費很長時間。 同樣,我寫的越多,花費的時間越長。 知道為什么嗎?
這似乎僅在閃存驅動器/ SD卡上發生。
寫入可能被緩沖。 關閉會導致其刷新,因此您必須等待它首先寫入磁盤。 嘗試在您的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;
您正在編寫大量數據。 您的問題可能是由於緩沖。 如果我是我,我會嘗試無緩沖的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);
看看是否更快
我遇到了同樣的問題,發現在每次循環迭代中打開追加/寫入/關閉文件要比在循環之前打開一次和在循環之后關閉一次更快。 每次關閉都會以某種方式執行我們期望的刷新,但是flush()不會。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.