【问题标题】:Read Large Text file in Python在 Python 中读取大文本文件
【发布时间】:2019-04-04 21:15:19
【问题描述】:

我想从 Python 中的文本文件中获取每一行(大约 10 亿行),并从每一行中获取一些单词并插入另一个文件 我用过

with open('') as f:
   for line in f:
       process_line(line)

这个过程需要很多时间,我怎样才能在大约 2 小时内阅读所有内容?

【问题讨论】:

  • process_line 实际上是做什么的?请向我们展示代码。
  • 它不完全是 process_lines。每行由 "word,word1,word2" 组成,我正在拆分这三个单词 (.split(",")) 并使用 f.write() 将它们写入 3 个单独的文件
  • 如果处理每一行是独立的,这个问题可以建模为分而治之。首先使用 Linux split 命令将大文件拆分为较小的文件。稍后,在拆分文件上运行相同的程序,最好是并行运行。

标签: python python-3.x file


【解决方案1】:

脚本性能的瓶颈可能来自它同时写入 3 个文件这一事实,导致文件之间出现大量碎片,从而产生大量开销。

因此,在将 300 万字写入输出文件之前,您可以缓冲 100 万行(这应该占用不到 1GB 的内存),而不是在读取行的同时写入 3 个文件一次一个文件,这样它会产生更少的文件碎片:

def write_words(words, *files):
    for i, file in enumerate(files):
        for word in words:
            file.write(word[i] + '\n')

words = []
with open('input.txt', 'r') as f, open('words1.txt', 'w') as out1, open('words2.txt', 'w') as out2, open('words3.txt', 'w') as out3:
    for count, line in enumerate(f, 1):
        words.append(line.rstrip().split(','))
        if count % 1000000 == 0:
            write_words(words, out1, out2, out3)
            words = []
    write_words(words, out1, out2, out3)

【讨论】:

  • 不过,2 小时 听起来大量 太长了,即使是十亿行也是如此。不过,OP 的机器可能是 1970 年代的。
  • 我正在使用最新的 Macbook Pro(8 GB RAM + 512 GB 内存)
  • 但是,快速而肮脏的计算,您正在实现10_000_000 列表的列表(每个列表包含三个项目)。 即使忽略实际字符串,并假设 3 个项目的列表约为 88 个字节(再次忽略实际字符串,这不是微不足道的),我预测 10_000_000*8*88*1e-9 == 7.04 gigabytes .... 拿这个下降一个数量级
  • @juanpa.arrivillaga 好点。我已经更新了答案,一次只缓冲一百万行。
  • 注意,更实际一点,我仍然预测大约 2-gigs,给定一个大约 10 的平均字符串大小,所以每个字符串对象大约 60 个字节,所以:1_000_000*8*(88 + 60*3)*1e-9 但这应该是一个大小合适
【解决方案2】:

阅读 Python 中的生成器。 您的代码应如下所示:

def read_file(yours_file):
    while True:
        data = yours_file.readline()
        if not data:
            break
        yield data

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2020-11-12
    • 2021-12-22
    • 2011-03-30
    相关资源
    最近更新 更多