2016-08-18 4 views
0

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() 

は誰でも助けることができます:

は、私のコードの全体的な構造を以下に示します(私はちょうど私が抽象化された形で、プログラムを理解することが不可欠であると思ったのコードを書いたの)?

+1

を参照してください。同じファイルに複数のプロセスを書き込んでいるとしますか?あなたがロックを使用していない場合、*それは奇妙な動作とデータの損失をもたらします*。 –

+0

いいえ、彼らは私が言及したように、それぞれ別々のファイルに書いています。「彼らは通常、CSVファイルを別々に書き始めます。 – user3052069

+0

そして、ファイルがもはや書き込まれていないとどのように判断しますか?ファイルのバッファリングについて説明しましたか?おそらく 'logging'モジュールを使って、各プロセスが受け取っている情報の量を追跡できますか? –

答えて

0

たとえば、1000行のチェックポイントでf.flush()コールを追加してみてください。たぶん、ファイルがバッファリングされていて、ディスクに書き込まれていない可能性があります。たとえば、How often does python flush to a file?

+0

フラッシュは私の問題に関連する可能性があるようだ、私はフラッシュと試して検索します。しかし、私のプログラムはファイルへの書き込みを行うため、ファイルを開いてデータ行が書き込まれていることを知ることができず、突然ランダムに書き込みを停止します。 – user3052069

+0

OSはファイルを時折フラッシュするため、ファイルに何かが表示されます。それは次のフラッシュがあなたが待っていたよりも長く起こることです。 – VBB

関連する問題