簡體   English   中英

花很長時間關閉fstream

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM