您的位置:首页 > 编程语言 > Python开发

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对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: