0

我正在使用 python 的“warc”库读取 WARC 文件。我正在使用的当前文件约为 4.50 GB。事情是 ;

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

执行这 2 行最多需要 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 秒并不是那么好。有什么建议么 ?

4

2 回答 2

2

但在这种情况下,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 天太长,开发时间最好投资于处理的并行化。对于 Common Crawl 数据,已经有很多示例如何实现这一点,例如cc-mrjobcc-pyspark

于 2018-08-13T13:13:20.627 回答
0

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

使用分析器来识别性能瓶颈,然后专注于这些以进行优化。

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

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

于 2018-08-11T14:07:59.157 回答