如何在Python中读取100GB单行文本文件?

时间:2019-08-16 12:36:28

标签: python python-3.x

我在Windows平台上使用Python3。由于文件阅读器的默认行为是逐行使用文件,因此我很难处理只有一行的100GB文本文件。

我知道诸如this之类的解决方案,它们引入了一个自定义记录分隔符来用\n替换一个常用字符;但是我仍然想知道是否只能通过Python使用和处理文件?

我只有8GB的RAM。我的文件是销售记录(包括商品,价格,买家等)。我对文件的处理主要是编辑价格编号。记录之间用|字符隔开。

2 个答案:

答案 0 :(得分:4)

# !/usr/bin/python3
import os, sys

# Open a file
fd = os.open("foo.txt",os.O_RDWR)

# Reading text
ret = os.read(fd,12)
print (ret.decode())

# Close opened file
os.close(fd)
print ("Closed the file successfully!!")

with open(filename, 'rb') as f:
    while True:
        buf = f.read(max_size)
        if not buf:
            break
        process(buf)

from functools import partial

with open('somefile', 'rb') as openfileobject:
    for chunk in iter(partial(openfileobject.read, 1024), b''):
        do_something()

答案 1 :(得分:1)

如果您运行的是64位操作系统,则可以mmap进入整个文件,并让您的操作系统实际在后台为您进行阅读。 mmap版的文件大多与bytearray呈现相同的界面,因此您可以执行以下操作:

import mmap

with open('largefile.txt', 'rb') as fd:
    buf = mmap.mmap(fd.fileno(), 0, access=mmap.ACCESS_READ)

然后您就可以将buf用作普通的bytearray,并通过类似的操作遍历分隔符:

def split_sep(buf, sep=b'|'):
  pos = 0
  while True:
    end = buf.find(sep, pos)
    if end == -1:
       break
    yield buf[pos:end]
    pos = end + 1
  yield buf[pos:]

但这只是一个演示。您可能想要做一些更复杂的事情,例如在进行yield等操作之前从字节进行解码。