Last.fmからデータを取得して、これらのデータをCSVファイルに書き込もうとしています。私はa.csvを持っていて、このa.csvの各行に基づいて、Last.fmから追加のデータを取り出し、b.csvに保存します。その結果、a.csvとb.csvは同じサイズになります。Pythonはcsvへの書き込みをランダムに停止しますが、forループはまだ実行中です
a.csvは約800万本のデータラインを持つ大規模なテキストファイルであるため、私はそれぞれ約25万本の行を処理する複数のプロセスを実行しようとしています。
私はPythonマルチプロセッシングモジュールを試してみましたが、複数の端末を実行しようとしました。問題はほとんどの場合(約10分の9以上)プロセスがランダムに各CSVファイルへの書き込みを停止することです。
たとえば、4つのプロセスの実行を開始し、通常はCSVファイルを別々に書き出します。ランダムな時間が経過すると、CSVファイルのいくつかはもう修正されません。時にはCSVの1台がプロセスの実行を開始した直後(数分程度)に停止し、数時間後、または数十時間後に他のCSVも停止します。これらのパターンは完全にランダムであり、まれにすべてのプロセスが正常に終了するため、停止する理由を把握できません。私は他のコンピュータで試してみましたが、違いはありませんので、問題はコンピューティングに依存しないようです。
また、CSVファイルの変更が中止されても、コードを1000データ行ごとに端末に出力させるため、プロセスはまだ実行されています。
f_reader = csv.reader(f, delimeter=',')
# (same for other csv files needed ..)
for line in a.csv:
if 1000 data lines are processed:
print('1000 tracks processed')
url = Lastfm API root url + selective data in line
req = urllib2.Request(url)
response = urllib2.urlopen(req) # fetch data from Last.fm and save result to req
info = etree.fromstring(response.read())
temp1 = info.find('data1').text.encode('utf-8')
temp2 = info.find('data2').text.encode('utf-8')
temp = [temp1, temp2]
for column in temp:
f.write('%s;' % column)
f.write('\n')
f.close()
は誰でも助けることができます:
は、私のコードの全体的な構造を以下に示します(私はちょうど私が抽象化された形で、プログラムを理解することが不可欠であると思ったのコードを書いたの)?
を参照してください。同じファイルに複数のプロセスを書き込んでいるとしますか?あなたがロックを使用していない場合、*それは奇妙な動作とデータの損失をもたらします*。 –
いいえ、彼らは私が言及したように、それぞれ別々のファイルに書いています。「彼らは通常、CSVファイルを別々に書き始めます。 – user3052069
そして、ファイルがもはや書き込まれていないとどのように判断しますか?ファイルのバッファリングについて説明しましたか?おそらく 'logging'モジュールを使って、各プロセスが受け取っている情報の量を追跡できますか? –