按行分块大字符串的最佳方法

时间:2015-10-29 13:14:08

标签: python regex string file split

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

2 个答案:

答案 0 :(得分: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字符串的缺点 - 它们是不可变的,如果想要做一些更改,解释器将创建一个副本。文件不会受此影响,允许就地操作而根本不加载整个文件。
  4. 我还建议将解决方案2或3封装到一个单独的类中,以保持换行索引和字符串内容的一致性。我认为Proxy模式和lazy evaluation的概念适合这里。

答案 1 :(得分:0)

您可以尝试逐行读取文件

f= open(filename)

partialstring = f.readline()

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