繁体   English   中英

有效地读取WARC文件

[英]Reading WARC Files Efficiently

我正在使用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秒在这种情况下并不是很好。 有什么建议么 ?

但是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天太长,则开发时间最好用于并行处理。 已经有很多可用的示例来实现Common Crawl数据的实现,例如cc-mrjobcc-pyspark

获取该模块的源代码,然后检查优化潜力。

使用探查器确定性能瓶颈,然后集中精力进行优化。

在Cython中重写Python代码并将其编译为本地代码可能会产生巨大的变化。 因此,可能值得尝试。

但是,无论如何,您确实需要在下面的实际代码中工作,而不是在互联网论坛上猜测如何加速两行脚本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM