1

因此,我有一个程序可以接收多达 1000 个文件路径,其想法是读取 3 个特定字节以返回日期,这一切都很好。

问题在它开始时就开始了,并且内存使用量飞向最大值,并因此在几秒钟内冻结了我的电脑。

我猜打开过程会消耗几兆或其他东西......关于如何在没有大量内存使用的情况下实现我需要的任何想法?

注意:我打开的文件大约为 15 GB

int main(int argc, char *argv[])
{
    string paths[1000] = {};
    int date[3] = {0};

    cout << "Arg count: " << argc << endl;
    if (argc <= 1)
        paths[0] = "PRIV.EDB";
    else
        for(int i = 1;i<argc;i++){
            paths[i-1] = argv[i];
        }

    cout << "Start\n\n";
    for (int i=0;i<1000;i++)
    {
        if (paths[i].empty())
            break;
        cout << paths[i] << endl;
        ifstream pFile;
        pFile.open(paths[i], ios::binary);
        pFile.seekg(195);
        date[0] = pFile.get();
        date[1] = pFile.get();
        date[2] = pFile.get();
        cout << date[0] << " : " << date[1] << " : " << date[2] << " \n";
        cout << endl;
        pFile.clear();
        pFile.close();
    }
    cout << "Fin\n";

    if (argc <= 1)
        getchar();

    return date[0];
}
4

1 回答 1

2

使用内存映射文件以获得更好的性能。

http://msdn.microsoft.com/en-us/library/dd997372.aspx

MSDN:

这些内存映射文件适用于处理非常大的源文件

维基百科:

内存映射文件的主要好处是提高 I/O 性能,尤其是在用于大文件时...访问内存映射文件比使用直接读写操作更快,原因有两个。首先,系统调用比对程序本地内存的简单更改要慢几个数量级。其次,在大多数操作系统中,实际上映射的内存区域是内核的页面缓存(文件缓存),这意味着不需要在用户空间创建副本。

为了便于实施,请参阅: http: //www.boost.org/doc/libs/1_54_0/doc/html/interprocess.html

利用:

提升/进程间/文件映射

升压/进程间/mapped_region

于 2013-09-02T12:23:14.340 回答