我正在使用python的“WARC”库读取warc文件。我正在使用的当前文件大约是4.50GB。问题是;
file = warc.open("random.warc")
html_lists = [line for line in file]执行这2行需要40秒。因为会有64000多个像这样的文件,所以每个文件花费40秒是不可接受的。你们有什么提高性能的建议或其他方法吗?
编辑:我发现美容汤的操作需要一些时间。所以我把它取了下来,自己写了一些必要的东西。现在速度快了100倍。读取和处理4.50GB数据需要+- 60秒。使用这一行代码,我从数据中删除脚本;
clean = re.sub(r"<script.*?</script>", "", string=text)用这个,我拆开文本,去掉我不需要的邮票
warc_stamp = str(soup).split(r"\r\n\r\n")就像我说的,它更快,但是60秒在这种情况下不是很好。有什么建议吗?
发布于 2018-08-13 13:13:20
但在这种情况下60秒不是很好
当然,这意味着处理所有64,000个WARC文件需要45天,如果不是并行的话。但是作为一个比较: Hadoop作业爬行WARC文件的内容,以及那些将WARCs转换成WAT和湿式文件的任务,每个任务需要大约600个CPU时间。
WARC文件是gzip压缩的,因为磁盘空间和下载带宽通常是限制因素。解压缩定义了任何优化的基线。例如,解压缩946 MB的WARC文件需要21秒钟:
% time zcat CC-MAIN-20170629154125-20170629174125-00719.warc.gz >/dev/null
real 0m21.546s
user 0m21.304s
sys 0m0.240s迭代WARC记录只需要很少的额外时间:
% cat benchmark_warc.py
import gzip
import sys
import warc
n_records = 0
for record in warc.WARCFile(fileobj=(gzip.open(sys.argv[1]))):
if record['Content-Type'] == 'application/http; msgtype=response':
n_records += 1
print("{} records".format(n_records))
% time python benchmark_warc.py CC-MAIN-20170629154125-20170629174125-00719.warc.gz
43799 records
real 0m23.048s
user 0m22.169s
sys 0m0.878s如果处理有效负载的时间仅是解压缩所需时间的两倍或三倍(我无法想象您能够显着地超过GNU gzip实现),那么您将接近最佳状态。如果45天太长,则开发时间最好投入到处理的并行化中。对于公共爬行数据,已经有很多可用的示例来实现这一点,例如cc-mrjob或cc-电火花。
发布于 2018-08-11 14:07:59
获取该模块的源代码,并检查优化潜力。
使用分析器来识别性能瓶颈,然后将重点放在这些瓶颈上进行优化。
用Cython重写Python代码并将其编译成本机代码会产生很大的不同。因此,这可能值得一试。
但是无论如何,与其在互联网论坛上猜测如何加速两行脚本,你还需要使用下面的实际代码!
https://stackoverflow.com/questions/51786386
复制相似问题