fstream.write()被卡住了很长时间?

时间:2017-11-22 02:44:54

标签: c++ performance io fstream

fstream.write()在执行删除目录时卡住了。看起来我的硬盘驱动器在同时写入和删除时非常繁忙。那么如何避免这种卡住,write()函数的任何超时参数?以下是我的程序代码:

#include <fstream>
#include <iostream>
int main()
{
    std::ios_base::sync_with_stdio(false);
    fstream myfile = std::fstream("sample.txt", std::ios::out | std::ios::binary);
    //Start thread remove old data
    INT64* paramsInput = new INT64[2];
    char* dir = "D:\";
    paramsInput[0] = (INT64)dir;
    paramsInput[1] = 50; //GB
    _beginthreadex(Null, 0, &remove_old_data, (VOID*)paramsInput);

    int size = 0;
    char* data = NULL;
    while (true)
    {
        data = NULL;
        size = getData(data); //data is available every 10 ms
        if(size > 0 && data != NULL) //size ~= 30 KB
        {
            myfile.write(data, size); //write data to file
        }       
    }   
}

UINT32 __stdcall remove_old_data(VOID* _pArguments)
{
    char* dir = (char*)_pArguments[0];
    int   freeSpaceThreshold = _pArguments[1];
    delete[] _pArguments;
    while(true)
    {
        int curFreeSpace = GetFreeSpace(dir);
        if(curFreeSpace < freeSpaceThreshold )
        {
            //remove old files and directory here
            ClearData(dir);//File size is about 10 MB, 40,000 files in dir
        }
        Sleep(10000);
    }   
}

1 个答案:

答案 0 :(得分:1)

要确切地说出你的情况下瓶颈是什么有点困难,尽管可能有几个。删除文件可能非常耗时,尤其是在包含许多文件的目录中执行多个文件时。写入大多数完整驱动器的速度也较慢,因为操作系统需要更长时间才能找到存储新数据的空白区域,而且这些区块更小。

以下是一些改进性能的建议,没有特别的顺序:

1)使用SSD。这消除了几乎所有硬盘访问的延迟。

2)使用OS API函数进行文件访问,并使用无缓冲写入。这将避免使用仅写入且不再读取的数据填充磁盘高速缓存,从而允许目录信息保持高速缓存。

3)使用多个子目录存储数据。如果目录大小​​太大,目录中的文件访问速度可能会变慢。

4)在本地缓存30K数据块,保持多个块排队等待写入,并且只有在remove_old_data没有清理目录时才写出来。