【问题标题】:Best way to chunk a large string by line逐行分块大字符串的最佳方法
【发布时间】:2016-01-29 15:44:40
【问题描述】:

我有一个使用get_contents_as_string() 从 S3 读取的大文件 (400+ MB),这意味着我最终将整个文件作为字符串保存在内存中。我正在并行运行其他几个内存密集型操作,因此我需要一种内存有效的方法来将结果字符串按行号拆分为块。 split() 是否足够高效?或者像re.finditer() 这样的方式更好?

【问题讨论】:

    标签: python regex string file split


    【解决方案1】:

    我在这里看到三个选项,从最消耗内存到最少:

    1. split 将创建文件的副本作为字符串列表,这意味着额外使用了 400 MB。易于实施,占用 RAM。
    2. 使用re 或简单地遍历一个字符串并记住\n 的位置:for i, c in enumerate(s): if c == '\n': newlines.append(i+1)
    3. 与第 2 点相同,但字符串作为文件存储在 HDD 上。速度慢但内存效率很高,也解决了 Python 字符串的缺点——它们是不可变的,如果想要做一些更改,解释器会创建一个副本。文件不会受此影响,允许就地操作而无需加载整个文件。

    我还建议将解决方案 2 或 3 封装到一个单独的类中,以保持换行索引和字符串内容一致。我认为Proxy 模式和lazy evaluation 的想法很适合。

    【讨论】:

      【解决方案2】:

      你可以尝试逐行读取文件

      f= open(filename)
      
      partialstring = f.readline()
      

      https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files

      【讨论】:

      • 我的数据在一个字符串中,而不是一个文件中,所以这不起作用。
      猜你喜欢
      • 2012-11-16
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      相关资源
      最近更新 更多