2016-12-21 13 views
0

私は、使用したいデータセットでいくつかの前処理/トークン処理を行うPythonモジュールを持っています。データセットは144M行のテキストファイルで、メモリに読み込んで分割し、シャッフルしてから新しいファイルに書き出します。以前は、書き込みは次の関数によって行われた:非常に大きなファイルを書き込むIOError

def write_lines(filename, lines): 
with io.open(filename, 'w', encoding='utf-8') as fout: 
    fout.write('\n'.join(lines)) 

144Mラインデータセットでこれをやろうとしたとき、私はIOError: [Errno 22]エラーを取得します。ただし、6Mラインのデータセットで全く同じコードを実行することに問題はありません。このモジュールにデータセットを送信する前に、に記載されているように、パターン[\x00-\x7f]に一致する文字のみがファイル内にあることを保証するフィルタリングサービスが実行されます。

私はPython2.7をAnaconda環境で実行しています。私が使っているコードのいくつかは、私が試したことがあってもPython3で動作しない複雑な文字列処理ロジックを実行するオープンソースプロジェクトから来ているので、Python3への切り替えはオプションではありません。

このエラーの原因となる大きなデータセットはありますか?私は間違っている可能性があるのはメモリエラーだと思っていただろうが、Errno 22はメモリとは関係がないようだ。

+0

シャッフルする前にフィルタステップを個別に実行できますか? –

+0

万が一OSXをお使いですか?あなたがいる場合は、これを見てください[関連する質問](http://stackoverflow.com/questions/11662960/ioerror-errno-22-invalid-argument-when-reading-writing-large-bytestring) – Jakub

+0

@Jakubはい私iMacでコードを実行しています。 – jbird

答えて

2

1つの大きな行に行を追加する必要はありません。あなたはおそらく長すぎる行を得ているでしょう。これを試してください:

def write_lines(filename, lines): 
    with io.open(filename, 'w', encoding='utf-8') as fout: 
     for line in lines: 
      fout.write(line + '\n') 

questionを見てください。

+1

に依存する独立したJavaモジュール(多くの他のロジックと共に)で行われます。または、おそらくより簡潔に: 'fout.writelines(行+ '\ n'行行内) ' – SethMMorton

+0

これは問題を解決しました、ありがとうございます! – jbird

関連する問題