0

現在、最初の Python プロジェクトに取り組んでおり、2GB のファイルを解析する必要があります。行ごとに行った場合、非常に遅くなることがわかりました...ただし、次を使用したバッファリング方法:

f = open(filename)                  
lines = 0
buf_size = 1024 * 1024
read_f = f.read 
buf = read_f(buf_size)
while buf:
    for line in buf:
      #code for string search
      print line
    buf = read_f(buf_size)

ここで、印刷行は「行」を印刷しません。行ごとに一度に文字を印刷するだけです。そのため、部分文字列の検索に問題があります...助けてください!

4

2 に答える 2

1

print lineは文字列であるため文字を出力し、文字buf列を反復処理すると、文字列の文字が 1 文字の文字列として生成されます。

行ごとの読み取りが遅いと言うとき、どのように読み取りを実装しましたか? readlines() を使用していた場合、それが遅さの原因になります ( http://stupidpythonideas.blogspot.com/2013/06/readlines-considered-silly.htmlを参照)。

ファイルはその行にわたって反復可能であり、Python は反復時にバッファー サイズを選択するため、これはニーズに合っている可能性があります。

for line in f:
    # do search stuff

バッファ サイズを手動で指定する場合は、次のようにすることもできます。

buf = f.readlines(buffersize)
while buf:
    for line in buf:
        # do search stuff
    buf = f.readlines(buffersize)

ただし、通常は 2 つのうちの最初の方が優れています。

于 2013-10-03T15:57:34.827 に答える
0

問題は、 buf が文字列であることです...

buf = "abcd" と言います。

つまり、buf[0] = a、buf[1]=b などです。

for line in buf:
    print line

a b c d になります

つまり、for ループでは、「行」をループするのではなく、buf-string のすべての要素をループします。readlines を使用するか、"\n" を探してバッファを 1 行に分割することができます。

于 2013-10-03T16:06:09.797 に答える