[英]Reading file with fread() in reverse order causes memory leak?
我有一個基本上這樣做的程序:
我的問題是:為什么內存消耗看起來如下,即使我附加的代碼中沒有明顯的內存泄漏?
以下是為獲取上述圖像而運行的程序源:
#include <stdio.h>
#include <string.h>
int main(void)
{
//allocate stuff
const int bufferSize = 4*1024*1024;
FILE *fileHandle = fopen("./input.txt", "rb");
if (!fileHandle)
{
fprintf(stderr, "No file for you\n");
return 1;
}
unsigned char *buffer = new unsigned char[bufferSize];
if (!buffer)
{
fprintf(stderr, "No buffer for you\n");
return 1;
}
//get file size. file can be BIG, hence the fseeko() and ftello()
//instead of fseek() and ftell().
fseeko(fileHandle, 0, SEEK_END);
off_t totalSize = ftello(fileHandle);
fseeko(fileHandle, 0, SEEK_SET);
//read the file... in reverse order. This is important.
for (off_t pos = totalSize - bufferSize, j = 0;
pos >= 0;
pos -= bufferSize, j ++)
{
if (j % 10 == 0)
{
fprintf(stderr,
"reading like crazy: %lld / %lld\n",
pos, totalSize);
}
/*
* below is the heart of the problem. see notes below
*/
//seek to desired position
fseeko(fileHandle, pos, SEEK_SET);
//read the chunk
fread(buffer, sizeof(unsigned char), bufferSize, fileHandle);
}
fclose(fileHandle);
delete []buffer;
}
我還有以下觀察:
fread()
調用會使內存泄漏消失 。 這很奇怪,因為我沒有在它附近分配任何東西,這可能會引發內存泄漏...... fseeko()
),也會使內存泄漏消失 。 這是極其奇怪的部分 。 更多的信息...
fread()
結果 - 不會產生任何異常。 fseek
和ftell
。 setbuf(fileHandle, NULL)
類的東西。 setvbuf(fileHandle, NULL, _IONBF, *any integer*)
東西setvbuf(fileHandle, NULL, _IONBF, *any integer*)
。 g++ test.cpp -o test
。 兩者都存在這種行為。 我認為它與某種內部緩存構建有關,直到它填滿整個文件。 幕后真的如何運作? 如何以便攜方式防止這種情況?
我認為,這是一個操作系統問題(甚至是操作系統資源使用報告問題),而不是程序問題。 當然,它只使用5 MB內存:自身為1 MB(libs,堆棧等),緩沖區為4 MB。 每當你執行fread()時,操作系統似乎將文件的一部分“綁定”到你的進程,並且似乎不會以相同的速度釋放它。 由於機器上的內存使用率很低,這不是問題:操作系統只是讓已經讀取的數據“閑置”超過必要的時間,可能假設您的應用程序可能很快再次讀取它,然后它就不會必須再次做那個綁定。
如果內存壓力較高,則操作系統很可能會更快地解除內存綁定,因此內存使用歷史記錄的跳躍會更小。
我有完全相同的問題,雖然在Java中,但在這種情況下無關緊要。 我通過一次讀取更大的塊來解決它。 我還讀了4Mb大小的塊,但是當我把它增加到100-200 Mb時,問題就消失了。 也許它也會為你做到這一點。 我在Windows 7上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.