4

メヌエットごとに 2 つの機器から値を読み取り、それを .csv ファイルに保存する小さなプログラムを作成しました。PC がクラッシュしたり、その他の問題が発生した場合にデータの損失が発生しないように、すべてのポイントを収集するたびにファイルを更新して保存する必要がありました。これを行うには、ファイルを開き (ab モード)、書き込み行を使用し、ループでファイルを閉じます。コレクション間の時間は約 1 分です。これは静かにうまく機能しますが、問題はデータ収集の 5 ~ 6 時間後です。.csv ファイルへの保存が停止し、エラーは発生しません。コードは実行され続け、グラフは何も起こらなかったように更新されますが、 .csv ファイルは、データが失われていることを示しています。使用しているコードに問題があるかどうかを知りたいです。また、これからライブ プロットを行うサブプロセスを実行するべきではありません。

##Initial file declaration and header
with open(filename,'wb') as wdata:
     savefile=csv.writer(wdata,dialect='excel')
     savefile.writerow(['System time','Time from Start(s)','Weight(g)','uS/cm','uS','Measured degC','%/C','Ideal degC','/cm'])

##Open Plotting Subprocess
 draw=subprocess.Popen('TriPlot.py',shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
##data collection loop
while True:
   Collect Data x and y
   Waits for data about 60 seconds, no sleep or pause commoand used, pyserial inteface is used.
   ## Send Data to subprocess 
   draw.stdin.write('%d\n' % tnow)
   draw.stdin.write('%d\n' % s_w)
   draw.stdin.write('%d\n' % tnow)
   draw.stdin.write('%d\n' % float(s_c[5]))

   ##Saving data Section 
   wdata=open(filename,'ab')
   savefile=csv.writer(wdata,dialect='excel')
   savefile.writerow([tcurrent,tnow,s_w,s_c[5],s_c[7],s_c[9],s_c[11],s_c[13],s_c[15]])
   wdata.close()

PS このコードは、示されていないコードに対して次のパッケージを使用します。pyserial、csv、os、subprocess、Tkinter、string、numpy、time、wx。

4

1 に答える 1

1

ブロックされている場合draw.stdin.write()は、おそらくdraw.stdoutタイムリーに消費していないことを意味します. ドキュメントでは、OS パイプ バッファがいっぱいになることによるデッドロックについて警告しています。

出力が必要ない場合はstdout=devnulldevnull = open(os.devnull, 'wb')コードをブロックせずに出力を読み取るためのいくつかの方法があります: スレッド、選択、tempfile.TemoraryFile.

于 2013-01-16T23:01:11.547 に答える