对一万多个文件进行重复写入,有没有办法提高速度?

PunWinger 2012-02-12 10:47:06
由于要对一万多个文件进行3000多次的重复写入,我做法是循环3000多次,每次利用ofstream来重复打开关闭这一万多个文件,发现每一次循环都要花费大约30秒的时间,比较耗时,问一下各位高手有没有办法提高速度?

曾经考虑过利用ofstream数组,一次打开这一万多个文件,但发现windows貌似限制只能打开510个文件,所以只能失败
...全文
352 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wolf0403 2012-02-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 pathuang68 的回复:]

尽量想办法减少打开文件和关闭文件的次数,这一点很重要,比如要写10次到某个文件,可以考虑先把这10次需要写入的数据放在内存里面,然后一次写入。

多线程在这种情况下,可能有效,也可能无效。对于多核的CPU,多线程可以提高计算速度,如果在写文件之前有大量的计算,那么多线程是有效的,反之不会有效,因为多线程不能提升硬盘IO的性能。
[/Quote]
说的清楚。
一种复杂的解决方案甚至是,用多线程计算,结果进队列由一个线程写入文件;这个线程对打开的文件句柄进行一定的缓冲。但因为上万个文件不可能全部同时打开,所以运气不好会有严重的缓冲颠簸。但最坏也不会比每次打开关闭更差。
hongwenjun 2012-02-13
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
#include <algorithm>
#include <fstream>
#include <sstream>

using namespace std;

// 加载文件到 string
string& loadFile_toString(string& str, fstream& infile)
{
stringstream oss;
oss << infile.rdbuf();
str = oss.str();
return str;
}

int main()
{
fstream inFile("main.cpp");
string main_cpp;
loadFile_toString(main_cpp , inFile);
inFile.close();

inFile.open("11.cbp");
string s11_cbp;
loadFile_toString(s11_cbp , inFile);
inFile.close();

cout << main_cpp << endl;
cout << s11_cbp << endl;
return 0;
}
hongwenjun 2012-02-13
  • 打赏
  • 举报
回复
string的数据输入到文件里
可以先用 stringstream 流做缓冲

stringstream oss;
// .....
vector<string>::iterator iter = vecData.begin();
while (iter != vecData.end()) {
oss << *iter++ << endl; //数据写到文件
if (ixnew++ % 100000 == 0) cout << "<"; //新数据计数器
}

// .....

ofDataFile <<oss.str();
ofDataFile.close();

oss.clear;
oss.str("");

// 下一个文件输出
PunWinger 2012-02-13
  • 打赏
  • 举报
回复
多线程我感觉太麻烦了,还是用单线程结局了

把所有的东西写进内存要3g多内存,于是我把数据分成两半,然后在重复写入两次而已,结果速度有了很大的提升,不过在设计的过程中出现了很多问题,例如内存数据太大,所以利用strcat时每次遍历太慢了,于是干脆就自己又保存一个unsigned long的数组,保存每个文件的大小,这样直接操纵内存....虽然对指针操作很麻烦,但的确加速了很多,感谢各位的提示了
pathuang68 2012-02-13
  • 打赏
  • 举报
回复
尽量想办法减少打开文件和关闭文件的次数,这一点很重要,比如要写10次到某个文件,可以考虑先把这10次需要写入的数据放在内存里面,然后一次写入。

多线程在这种情况下,可能有效,也可能无效。对于多核的CPU,多线程可以提高计算速度,如果在写文件之前有大量的计算,那么多线程是有效的,反之不会有效,因为多线程不能提升硬盘IO的性能。
bjbjbh 2012-02-12
  • 打赏
  • 举报
回复
多线程撒
东莞某某某 2012-02-12
  • 打赏
  • 举报
回复
你试试对于一个文件连续写3000次,而不是循环3000次的打开关闭文件
龙哥依旧 2012-02-12
  • 打赏
  • 举报
回复
...
纯帮顶!
cobras 2012-02-12
  • 打赏
  • 举报
回复
这种上规模的问题,要么采用并行算法,要么提高硬盘IO吞吐能力(如采用企业级的固态硬盘和磁盘阵列?)
c87527124 2012-02-12
  • 打赏
  • 举报
回复
不知道,来了就顶下。
rushu0765 2012-02-12
  • 打赏
  • 举报
回复
XUEXI YI XIA
Wolf0403 2012-02-12
  • 打赏
  • 举报
回复
如果每次写入的内容都是缓存在内存里大小已知,那么直接用 WriteFile 一次写入应该比 fstream 之类快一些。但这个应该不是根本上的解法。
PunWinger 2012-02-12
  • 打赏
  • 举报
回复
由于我是要读取许多文件,在处理其中的数据,然后按照某种顺序分别输出到这一万多个文件里去,所以很难更换操作顺序

不过感谢前面给的提示,我打算尝试一下把要输入的数据保存到内存里,在写入到文件里

不过,请问一下,有没有办法比较快速地把string的数据输入到文件里?C++标准里有没有这样的函数?或者是调用windows的CreateFile和WriteFile?
Sparkfire 2012-02-12
  • 打赏
  • 举报
回复
IO瓶颈是硬伤。。尽量cache
hongwenjun 2012-02-12
  • 打赏
  • 举报
回复
每个文件多少大呀
如果文件不是很大,把文件读到 内存里
Guilty 2012-02-12
  • 打赏
  • 举报
回复
最好是能合并这些文件,不要写这么多文件。
如果做不到,绝对不能把这些文件放在同一个目录里。每个目录不能放太多文件,否则会慢。
Wolf0403 2012-02-12
  • 打赏
  • 举报
回复
为什么要重复打开关闭?
能不能重新组合,合并每个文件的所有写入成一次?

for ( every file ) {
for ( every data ) {
open file
write data into file
close file
}
}
改成

for ( every file ) {
open file
for ( every data ) {
write data to file
}
close file
}
振翅高飞 2012-02-12
  • 打赏
  • 举报
回复
这个量的确是有点大了。
循环遍历一万个文件的根目录,
对每个文件fopen()
fgets()
fprintf()
fclose

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧