1

正確に 7168 行であることがわかっているファイルがあります。さまざまな条件下で、偽の行数が表示されます。たとえば、次のようにします。

file = open("testfile", 'r')
count = 0
for line in file:
   count += 1
   print "count: " + str(count)

このコードの結果: "count: 1098 "

file = open("testfile", 'r')
count = 0
for line in file:
   count += 1
   print line  ### this line is the only difference
   print "count: " + str(count)

このコードの結果: "count: 7168 "

私が考えることができる唯一のことは、どこかでメモリが不足していることです。「testfile」の母集団は、バックグラウンドで Popen から取得されます。アイデア/希望は、ユーザーがスクリプト内の完全なダンプを必要とするポイントに到達する前に、必要なすべてのデータをバックグラウンドでファイルにダンプすることです。ユーザーがテストファイルのコンテンツが必要なスクリプトのポイントに到達したが、Popen がまだ完了していない場合は、次のコードを実行します。

notified = False
while (os.path.getsize("testfile") == 0):
   if notified == False:
      print "Please hold, still dumping uids..."
      notified = True
print "done!"

os.path.getsize何億回も即座に呼び出すのは有害かもしれないと考えて、コードを修正しました。

notified = False
while (os.path.getsize("testfile") == 0):
   if notified == False:
      print "Please hold, still dumping uids..."
      notified = True
   time.sleep(3)   ### Delay 3 seconds
print "done!"

この場合、私の行数は6896となります(これは大幅に改善されていますが、実際の数ではありません)。

さらなる修正:

notified = False
while (os.path.getsize("testfile") == 0):
   if notified == False:
      print "Please hold, still dumping uids..."
      notified = True
   time.sleep(5)   ### Delay 5 seconds
print "done!"

これで、期待どおりに行数が7168になりました。

何が起こっているのか、より効率的に目標を達成する方法を誰かに説明してもらえますか? 全体的な目標は、私のスクリプトでは、スクリプトの後半のある時点で大量のデータをファイルにダンプする必要があることです。ユーザーのダウンタイムを減らすために、私の Popen はスクリプトの開始時にバックグラウンドで実行されます。このwhile (os.path.getsize("testfile") == 0)行は、競合状態を防ぐためのものです。

4

2 に答える 2

3

バックグラウンド タスクが完了するのを待っているわけではありません。while開く直前に実行中のループをこれに置き換えてみてくださいtestfile

pid.wait()

pidからの戻りはどこですかsubprocess.Popen()


別の方法として、ファイルを一気に作成することもできます。たとえば、サブプロセスを作成testfile.tmpして実行できますmv testfile.tmp testfile

于 2013-11-11T22:59:31.350 に答える
1

ファイルを書き込む 1 つのプロセスと、同じファイルを読み取る別のプロセスがあります。プロセス間同期のないマルチプロセッシング システムでは、競合状態が発生し、予想よりも低いカウントになります。これは実装言語とは関係ありません。

パイプは、プロセス間同期の素晴らしい仕事をします。コマンド:

$ producer | tee testfile | wc -l

は常に、wcに入れられた行数と正確に一致するカウントを生成しtestfileます。あなたはこの問題を必要以上に難しくしています。

于 2013-11-12T03:02:51.847 に答える