これにアプローチするには、次の 2 つの基本的な方法があります。
まず、read_column
ジェネレーター関数として、独自の明示的なバッファーを使用して関数を作成できます。
def column_reader(fp):
buf = ''
while True:
col_and_buf = self.buf.split(',', 1)
while len(col_and_buf) == 1:
buf += fp.read(4096)
col_and_buf = buf.split(',', 1)
col, buf = col_and_buf
yield col
…またはクラスとして:
class ColumnReader(object):
def __init__(self, fp):
self.fp, self.buf = fp, ''
def next(self):
col_and_buf = self.buf.split(',', 1)
while len(col_and_buf) == 1:
self.buf += self.fp.read(4096)
col_and_buf = self.buf.split(',', 1)
self.buf = buf
return col
しかし、read_until
バッファリングを内部で処理する関数を作成する場合は、次のようにするだけです。
next_col = read_until(fp, ',')[:-1]
read_until
ActiveState には複数のレシピがあります。
または、mmap
ファイルを持っている場合は、事実上無料で入手できます。ファイルを巨大な文字列として扱い、find
(または正規表現) を使用することができます。(これは、ファイル全体が仮想アドレス空間内に収まることを前提としています。おそらく 64 ビットの Python ビルドでは問題になりませんが、32 ビットのビルドでは問題になる可能性があります。)
明らかにこれらは不完全です。それらは EOF や改行を処理しません (実際には、100 万列の6行があり、1 つではありませんよね?)。しかし、アイデアを示すにはこれで十分なはずです。