当前位置: 首页 > 面试题库 >

并行读取大文件?

鄂曦之
2023-03-14
问题内容

我有一个大文件,需要阅读并制作字典。我希望尽快。但是我在python中的代码太慢了。这是显示问题的最小示例。

首先制作一些假数据

paste <(seq 20000000) <(seq 2 20000001)  > largefile.txt

现在,这里是一个最小的python代码片段,可以读入它并制作一个字典。

import sys
from collections import defaultdict
fin = open(sys.argv[1])

dict = defaultdict(list)

for line in fin:
    parts = line.split()
    dict[parts[0]].append(parts[1])

时间:

time ./read.py largefile.txt
real    0m55.746s

但是,可以更快地读取整个文件,如下所示:

time cut -f1 largefile.txt > /dev/null    
real    0m1.702s

我的CPU有8个核心,是否可以在python中并行化此程序以加快速度?

一种可能是读取大块输入,然后在不同的非重叠子块上并行运行8个进程,从而从内存中的数据并行创建字典,然后读取另一个大块。这可能在python中以某种方式使用多处理吗?

更新 。假数据不是很好,因为每个密钥只有一个值。更好的是

perl -E 'say int rand 1e7, $", int rand 1e4 for 1 .. 1e7' > largefile.txt

问题答案:

几年前,蒂姆·布雷(Tim Bray)的网站[1]上有一篇博客文章“ Wide Finder Project”。您可以从ElementTree
[3]和PIL [4]的名声中找到Fredrik
Lundh的解决方案[2]。我知道通常不建议在此站点上发布链接,但我认为这些链接比复制粘贴他的代码给您更好的答案。

[1] http://www.tbray.org/ongoing/When/200x/2007/10/30/WF-
Results

[2] http://effbot.org/zone/wide-finder.htm
[3] http
://docs.python.org/3/library/xml.etree.elementtree.html
[4]
http://www.pythonware.com/products/pil/



 类似资料:
  • 问题内容: 我实现了一个小的IO类,它可以从不同磁盘(例如,两个包含相同文件的硬盘)上的多个相同文件中读取数据。在顺序情况下,两个磁盘在文件上的平均读取速度均为60MB / s,但是当我进行交错操作(例如4k磁盘1、4k磁盘2然后合并)时,有效读取速度会降低到40MB / s而不是增加吗? 上下文:Win 7 + JDK 7b70、2GB RAM,2.2GB测试文件。基本上,我尝试以穷人的方式模仿

  • 问题内容: 我想遍历整个文件的每一行。一种方法是读取整个文件,将其保存到列表中,然后遍历感兴趣的行。此方法占用大量内存,因此我正在寻找替代方法。 到目前为止,我的代码: 执行此代码将显示错误消息:。 有什么建议么? 目的是计算成对的字符串相似度,这意味着对于文件中的每一行,我要计算每隔一行的距离。 问题答案: 正确的,完全Python的读取文件的方法如下: 该with语句处理文件的打开和关闭,包括

  • 本文向大家介绍Java实现按行读取大文件,包括了Java实现按行读取大文件的使用技巧和注意事项,需要的朋友参考一下 Java实现按行读取大文件 网上流行的那个俩while版本不靠谱 可考虑bufferedinputstream和bufferedoutputstream来字节读取,这个代码太简单了,适用于非频繁操作。或采用nio的FileChannel,比较适合于高并发操作,如下为filechann

  • 我试图在Perl6中逐行读取gz文件,但是,我被阻止了: > 如何在Perl6中逐行读取gz文件,但是,这种方法将所有内容读入会使用太多的RAM,除了在非常小的文件上之外,它都不可用。 我不明白如何使用Perl6的逐行获取所有内容,尽管我在他们的github上打开了一个问题 https://github.com/retupmoca/P6-Compress-Zlib/issues/17 我正在尝试用

  • 问题内容: 我有以下问题:我有一个近500mb的文件。它的文字全部排成一行。文本以虚拟行结尾分隔,称为ROW_DEL,并在文本中如下所示: 现在我需要进行以下操作,我想将此文件分成几行,这样我得到一个文件: 这个问题,即使我使用Windows文本编辑器将其打开,也会由于文件太大而中断。 是否可以像我在C#,Java或Python中提到的那样拆分此文件?什么是最好的灵魂,不要过度杀伤我的CPU。 问

  • 我需要读取大约500000条记录的Excel(xlsx)并每天添加大约2000条记录,我设法使用NPOI来完成,但内存消耗非常大(约8gb)。 我只能读取excel,使用ExcelDataReader消耗很少的内存,但是不可能添加更多的记录。 有什么工具可以写入这个不消耗大量内存的文件吗?