Python之mmap内存映射模块(大文本处理)说明
2016-11-17 11:48
711 查看
背景:
通常在UNIX下面处理文本文件的方法是sed、awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力。关于sed的说明可以看了解sed的工作原理,本文将介绍通过python的mmap模块来实现对大文件的处理,来对比看他们的差异。说明:
mmap是一种虚拟内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。关于系统中mmap的理论说明可以看百度百科和维基百科说明以及mmap函数介绍,这里的说明是针对在Python下mmap模块的使用说明。使用:
1,创建:创建并返回一个 mmap 对象m
m=mmap.mmap(fileno, length[, flags[, prot[, access[, offset]]]])
fileno: 文件描述符,可以是file对象的fileno()方法,或者来自os.open(),在调用mmap()之前打开文件,不再需要文件时要关闭。
~$ python mmap_search.py -h Usage: mmap_search.py [options] Options: -h, --help show this help message and exit -f FILENAME, --filename=FILENAME Filename for search -o OLD_WORD, --oldword=OLD_WORD the ip to use -n NEW_WORD, --newword=NEW_WORD the ip to use
View Code
脚本处理效果:(40G的文本)
1)sed:替换文本中第一次出现的内容 ~$ date && sed -i '0,/USE `EDCBA`;/s//USE `ABCDE`;/' test.sql && date 2016年 11月 17日 星期四 11:15:33 CST 2016年 11月 17日 星期四 11:21:47 CST 2)mmap:替换文本中第一次出现的内容(使用replace_keyword_once方法,查到一个就处理退出,越靠前越快) ~$ python mmap_search.py --filename='test.sql' --oldword="USE \`EDCBA\`;" --newword="USE \`ABCDE\`;" USE `ABCDE`; 替换成 USE `EDCBA`; cost time: 0.000128984451294 3)sed:替换文本中出现的内容(查找处理整个文本) ~$ date && sed -i 's/ENGINE=InnoDB/ENGINE=MyISAM/g' test.sql && date 2016年 11月 17日 星期四 10:04:49 CST 2016年 11月 17日 星期四 10:11:34 CST 4)mmap:替换文本中出现的内容(使用replace_keyword_all方法,查找处理整个文本) ~$ python mmap_search.py --filename="test.sql" --oldword="ENGINE=MyISAM" --newword="ENGINE=InnoDB" ENGINE=InnoDB 替换成 ENGINE=MyISAM cost time: 198.471223116
结论:修改大文本文件,通过sed处理,不管被修改的词在哪个位置都需要重写整个文件;而mmap修改文本,被修改的词越靠前性能越好,不需要重写整个文本,只要替换被修改词语的长度即可。
参考文档:
Memory-mapped file support通过mmap库映射文件到内存用法
mmap模块与mmap对象
相关文章推荐
- Python之mmap内存映射模块(大文本处理)说明
- Python之mmap内存映射模块(大文本处理)说
- 通过内存映射文件来颠倒文本内容(暂没有处理Unicode和换行符)
- Python学习笔记---模块;文件与文本处理
- python 5-4 如何将文件映射到内存mmap.mmap(f.fileno(),0,access=mmap.ACCESS_WRITE)
- Python - 文本处理模块
- Python - 文本处理模块
- python pickle模块使用-将内存数据保存到文本中以及从文本中直接读取信息到内存中
- VC++中使用内存映射文件处理大文件
- VC++中使用内存映射文件处理大文件
- VC++中使用内存映射文件处理大文件
- VC++中使用内存映射文件处理大文件
- VC++中使用内存映射文件处理大文件
- 关于内存映射文件技术处理大文件的读写
- 可爱的 Python:Python 中的文本处理
- VC++中使用内存映射文件处理大文件
- 关于内存映射文件技术处理大文件的读写
- VC++中使用内存映射文件处理大文件
- VC++中使用内存映射文件处理大文件
- VC中用内存映射文件处理大文件