高效读取 WARC 文件



我正在用python的"warc"库读取一个WARC文件。我正在使用的当前文件约为 4.50 GB。问题是 ;

file = warc.open("random.warc")
html_lists = [line for line in file]

执行这 2 行最多需要 40 秒。由于将有 64000 多个这样的文件,因此每个文件需要 40 秒是不可接受的。你们有什么技巧来提高性能或任何不同的方法吗?

编辑:我发现美丽汤的操作需要一些时间。所以我删除了它并自己编写了必要的东西。现在快了 100 倍。读取和处理 4.50 GB 数据需要 +- 60 秒。使用这行代码,我从数据中删除了脚本;

clean = re.sub(r"<script.*?</script>", "", string=text)

有了这个,我拆分了文本并删除了我不需要的邮票

warc_stamp = str(soup).split(r"rnrn")

正如我所说,它更快,但在这种情况下 60 秒并不是那么好。有什么建议吗?

但在这种情况下 60 秒不是那么好

当然,如果不并行完成,这意味着处理所有 64,000 个 WARC 文件需要 45 天。但作为比较:用于抓取 WARC 文件内容的 Hadoop 作业以及将 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。

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

使用探查器识别性能瓶颈,然后重点关注这些瓶颈以进行优化。

在Cython中重写Python代码并将其编译为本机代码可以产生巨大的差异。所以这可能值得一试。

但无论如何,与其在互联网论坛上猜测如何加速两行脚本,不如你真的需要使用下面的实际代码!

最新更新