首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效读取WARC文件

高效读取WARC文件
EN

Stack Overflow用户
提问于 2018-08-10 12:19:14
回答 2查看 2K关注 0票数 0

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

代码语言:javascript
复制
file = warc.open("random.warc")
html_lists = [line for line in file]

执行这2行需要40秒。因为会有64000多个像这样的文件,所以每个文件花费40秒是不可接受的。你们有什么提高性能的建议或其他方法吗?

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

代码语言:javascript
复制
clean = re.sub(r"<script.*?</script>", "", string=text)

用这个,我拆开文本,去掉我不需要的邮票

代码语言:javascript
复制
warc_stamp = str(soup).split(r"\r\n\r\n")

就像我说的,它更快,但是60秒在这种情况下不是很好。有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2018-08-13 13:13:20

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

当然,这意味着处理所有64,000个WARC文件需要45天,如果不是并行的话。但是作为一个比较: Hadoop作业爬行WARC文件的内容,以及那些将WARCs转换成WAT和湿式文件的任务,每个任务需要大约600个CPU时间。

WARC文件是gzip压缩的,因为磁盘空间和下载带宽通常是限制因素。解压缩定义了任何优化的基线。例如,解压缩946 MB的WARC文件需要21秒钟:

代码语言:javascript
复制
% time zcat CC-MAIN-20170629154125-20170629174125-00719.warc.gz >/dev/null 
real    0m21.546s
user    0m21.304s
sys     0m0.240s

迭代WARC记录只需要很少的额外时间:

代码语言:javascript
复制
% 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-mrjobcc-电火花

票数 2
EN

Stack Overflow用户

发布于 2018-08-11 14:07:59

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

使用分析器来识别性能瓶颈,然后将重点放在这些瓶颈上进行优化。

用Cython重写Python代码并将其编译成本机代码会产生很大的不同。因此,这可能值得一试。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51786386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档