我正在读取带有python'warc'库的WARC文件。我正在使用的当前文件约为4.50 GB。事情是;
file = warc.open("random.warc")
html_lists = [line for line in file]
执行这两行最多需要40秒。由于将有64000个类似这样的文件,因此每个文件花费40秒是不可接受的。你们有提高性能或其他方法的技巧吗?
编辑:我发现Beautifulsoup操作需要一些时间。所以我删除了它,然后自己写了必要的东西。现在快100倍。读取和处理4.50 GB数据需要+-60秒。通过这一行代码,我从数据中删除了脚本;
clean = re.sub(r"<script.*?</script>", "", string=text)
通过这个,我拆分了文本并删除了不需要的图章
warc_stamp = str(soup).split(r"\r\n\r\n")
正如我说的那样,速度更快,但60秒在这种情况下并不好。有什么建议吗?
答案 0 :(得分:1)
但是在这种情况下60秒不是那么好
当然,这意味着如果不并行处理所有64,000个WARC文件,则需要45天。但是作为比较:Hadoop作业要抓取WARC文件的内容,以及将WARC转换为WAT和WET文件的工作,每个大约需要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-pyspark。
答案 1 :(得分:0)
获取该模块的源代码,并检查优化潜力。
使用探查器识别性能瓶颈,然后集中精力进行优化。
用Cython重写Python代码并将其编译为 native 代码可能会产生巨大的变化。因此,可能值得尝试。
但是无论如何,您确实不需要在互联网论坛上猜测如何加速两行脚本,而是需要真正使用下面的实际代码!