Windows系统缓存和巨大的文件

时间:2008-12-03 11:19:13

标签: winapi filesystems

我的Windows系统缓存有问题。 示例代码:

int main(int argc, char* argv[])
{
    HANDLE file_ = INVALID_HANDLE_VALUE;
    file_ = CreateFile(
                            "test_file.txt",
                            GENERIC_WRITE, 
                            FILE_SHARE_READ, 
                            0, 
                            OPEN_ALWAYS, 
                            FILE_FLAG_SEQUENTIAL_SCAN, 
                            NULL
                            );
    if (file_ == INVALID_HANDLE_VALUE || file_ == NULL)
    {
        std::cout << "CreateFile error " << GetLastError() << std::endl;
        return GetLastError();
    }
    int counter = 0;
    DWORD io_bytes = 0;
    while(true)
    {
        char buffer[0x1000];
        int len = _snprintf_s(buffer, 0x1000, 0xffff, "test message %d\r\n", counter);
        counter++;
        if ( !WriteFile(file_, buffer, len, &io_bytes, NULL) )
        {
            std::cout << "WriteFile error " << GetLastError() << std::endl;
            return GetLastError();
        }
        if (counter > 10000000)
        {
            system("pause");
            return 0;
        }
    }
}

如果你运行这段代码并查看系统缓存大小,一切都会好的。但是如果你在这个程序运行时打开这个文件(test_file.txt)以便在某个查看器中读取(例如,对于总指挥官使用lister插件),你会看到,即使你已经关闭了你的查看器,系统缓存也在增长程序。这看起来像内存泄漏。这种行为是否正常?

3 个答案:

答案 0 :(得分:3)

Windows文件缓存将尝试尽可能多地保留RAM中的文件。在Windows NT中,加载一个非常大的文件可能会触发错误。如果文件不适合缓存,那么在你的机器不断交换之前,它将永远不再被释放,从而迫使RAM中的所有其他内容进入交换文件。

但你的情况更简单。在查看器中打开文件将加载缓存中的文件。由于您仍在编写它,因此缓存项将相应增长。现在你退出了观众,但你还在写作。 Windows应该怎么做?显然,它将文件保存在缓存中。

除非缓存从不收缩,否则这不是内存泄漏。当你用完RAM或b)在写入过程中关闭文件时它会缩小吗?

答案 1 :(得分:0)

当我的系统耗尽RAM缓存不收缩时,系统会将所有内容卸载到交换文件中。当我在写入过程中关闭文件时,系统缓存会缩小。

答案 2 :(得分:0)

如果我是你,我会尝试更好地理解构成任务管理器显示的'系统缓存'号码的内容。

我怀疑这不是你想的,而且你使用像“系统将所有内容卸载到交换文件中”这样的短语特别让我想知道你是否正试图将其他系统上的经验移植到Windows上。

Mark Russonovich的书籍被认为是这种东西的最佳参考。