如何避免将数据写入磁盘花费太长时间

static const int MAX_BUFFER_LEN = 1024*12; //in byets char *bff = new char[MAX_BUFFER_LEN]; int fileflag = O_CREAT | O_WRONLY | O_NONBLOCK; fl = open(filename,fileflag,0666); if(fl < 0) { printf("can not open file! n"); return -1; } do { ///begin one loop struct timeval bef; struct timeval aft; gettimeofday(&bef,NULL); write(fl,bff,MAX_BUFFER_LEN); gettimeofday(&aft,NULL); if(aft.tv_usec - bef.tv_usec > 20000) //ignore second condition { printf(" cost too long:%d n",aft.tv_usec - bef.tv_usec); } //end one loop //sleep usleep(30*1000); //sleep 30ms }while(1);

当我在Linux ubuntu 2.6.32-24-generic上运行程序时,发现COST TOO LONG打印在一分钟内显示1〜2次。 我试了两个USB硬盘和硬盘。我也试过这个程序在arm平台上,这种情况也发生了。 我认为3.2Mbps对于低速IO设备来说太高了。 所以我降低到了0.4Mbps,大大降低了打印频率。 是否有解决scheme来控制时间成本? write()只是将数据复制到kenal缓冲区并立即返回或等待fo磁盘IO完成? 是否有可能肯尼尔IO缓冲区已满,必须等待冲洗,但为什么只有几次花费这么久?

创build一个附加到控制台的进程,但带有redirect的标准IO句柄

在Windows平台上的.NET互斥:我完成后会发生什么?

旋转宇宙飞船模型的空间模拟器/游戏

Windows 10上的蓝牙LE在第二次连接尝试时抛出exception0x80070572

pthread窗口事件等效的问题

你不能加速磁盘,但你可以在磁盘工作的时候做其他的事情。 你不需要等待它完成。

但是,这在C中非常重要。您将需要非阻塞I / O,多线程或多处理。 尝试使用Google搜索这些关键字,以及如何使用不同的技术(您已经在那里使用非阻塞的fd)。

磁盘I / O性能受到每个写入周围的代码的负面影响,以测量时间(在这种粒度下测量时间会随着计算机做其他事情而偶尔出现尖峰)。

相反,测量代码性能来写入整个数据 – 循环外部的开始/结束时间(当然,循环正确)。

如果你正在调用一个你认为需要花费很多时间的文件,那么就让你的进程运行两个线程,一个是做主要任务,另一个是写入磁盘。

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...