zoukankan      html  css  js  c++  java
  • 大批量文件处理的7条建议

    最近由于项目需要,经常捣腾大批量的文档,期间也走过不少弯路。发现大批量文件处理这玩意,整不好就耗时,大部分时间都花在焦急的等待过程中。随着经验的丰富,渐渐地也摸索出一些大批量文件处理的原则,分享在这里:
    原则1:选择命令行,而不是GUI

    例如一个文件夹,里面存储了百万数量级的文件,且包含大量子文件夹。现在要统计文件夹下所有文件的数量,最常见的做法是右键点击文件夹属性,查看文件数量。然而这样做往往直接导致Windows无响应。替代的做法是,选择使用命令行工具来统计,比如dos下的dir命令,或者使用windows下的linux命令行工具:unxutils,它可以在windows下模拟大部分linux的命令,用find . -type f|wc -l就可以快速统计。这样做不仅比GUI下快出几倍,而且也不会出现“无响应”这样的不友好界面。
    原则2:压缩存储和传输
    有时候磁盘上要存储海量数据,将文件散步在磁盘块上,不仅占空间,也耗网络传输时间。对于普通文本文件,一般压缩格式的压缩率都接近10%。如果要支持跨平台,可选择zip或者tar这样的通用格式。而传输整块大文件,也比传输海量的小文件,节省不少时间。即便是将压缩和解压缩时间考虑在内,这样做也比直接传输散开的文件快不少。
    原则3:缓存常用信息
    如果你的程序经常需要遍历一个文件夹下的所有文件进行处理,且文件集合稳定不变,系统花在遍历的开销非常大。这种情况下,你可以维护一个文件列表,系统只是在第一次生成列表的时候进行了一次遍历,而此后系统不再需要再遍历文件夹,直接读取文件列表信息即可。而后者的代价远远小于前者。当然,也有很多情况下,常用信息经常是变化的,这就需要用到本文提到的第4条原则。
    原则4:增量式修改信息
    原则3中提到的文件夹如果经常存在变动,那是不是意味着每次还是不得不重新遍历所有信息,以保证得到最新的文件夹信息?答案当然是否,除非在最坏情况下,几乎所有的文件都被更新了一遍,否则你就可以只修改变化的那部分信息,来避免重新计算的开销。比如文件夹每天增加当天的新数据,且删除7天前的数据,那你就只需要更新这两部分数据,而保留中间的6天数据。
    原则5:并行处理
    大家都有用下载工具下载文件的经历。如果你的宽带最高支持每秒200K数据的带宽,那么如果你现在进行的任务每秒只下载100K数据,你就应该再开几个任务,并行下载,直到总下载量达到每秒200K的上限为止。这样才能最大限度地利用带宽,做最多的事。当然一旦吞吐量到达瓶颈,再增加进程或线程不仅不增加处理速度,还有可能导致资源死锁,枯竭。
    原则6:减少I/O开销
    读写I/O非常耗时,如果不是很必要,就不用做这些无谓的操作。比如很多软件都带有不同级日志的开关。如果只是普通用户使用,就不需要保存很多详细日志信息,当发生故障需要诊断时,工程师可以打开日志开关进行调试。测试工程师在平时测试中也可以重定向日志,或者nohup。不仅节省I/O,也可以保存足够的信息,进行错误跟踪。
    原则7:选择批处理,而不是one-by-one的处理
    好多软件都包含批处理的功能,通过给定的执行列表,批量处理。而不需要用户每次自己控制处理流程。比如wget软件,支持给定的URL列表下载。如果用户自己拆分URL列表,将其一一传给wget,每次传递都造成wget的一次启动和结束操作,造成无谓的开销。优秀的软件可以保证一次启动/结果来执行批处理。所以在使用任何软件前,先阅读一下帮助手册,看看有没有批处理的功能,保证你事半功倍。

    本文出自 “菜鸟威廉” 博客,请务必保留此出处http://williamwhe.blog.51cto.com/720802/155424

  • 相关阅读:
    反向传播(BP)算法理解以及Python实现
    tf.pad()
    Machine Learning-KNN
    【Python之os模块】使用
    Python实现返回指定范围内的所有素数
    Python中的map_reduce
    杨辉三角的Python实现
    斐波那契数列的Python实现
    Python中的可迭代对象
    NoReferencedTableError: Foreign key associated with column ** with which to generate a foreign key to target column 'id'
  • 原文地址:https://www.cnblogs.com/itelite/p/2324938.html
Copyright © 2011-2022 走看看