所以我有一个程序,最多可以接收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];
}
答案 0 :(得分: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
使用:
升压/间/ file_mapping
升压/间/ mapped_region