微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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性能受到每个写入周围的代码的负面影响,以测量时间(在这种粒度下测量时间会随着计算机做其他事情而偶尔出现尖峰)。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐