前提
初めまして。
websocketでJSONデータを受信し、それをCSVで保存するプログラムを作っています。
しかし、通信料の多い時間では秒間150件程度の受信があり、PCの処理が追い付かずエラーになり、止まってしまうといった現象に悩んでいます。タスクマネージャーを見ると、最大でCPUの使用量が70%以上となることがあり、半分以上を「Windows search indexer」
が占めていました。
実際タイムを計ると半分近くがdataframeからto_csvし保存することに使用されており、試しにto_csvで保存する箇所を消してみたとろ、
まったくエラーになることはありませんでした。
実現したいこと
最終的には一つのスレッドでwebsocketからデータの受信を行い、もう一つのスレッドでデータを時系列として分析・処理して
リアルタイムにリスポンスを行うことを目標としています。
そのためにはcsvでデータをやり取りすることにはこだわっておらず、
①リアルタイムデータを分析して処理するスレッドにデータを渡すことができ
②受信データを最後に保存する
ことができればよいと考えています
該当のソースコード
python
1 2 3df = pd.DataFrame(columns=[time,itemName,volume,price] 4 5def on_message(ws, message): 6 print('--- RECV MSG. --- ') 7 content = json.loads(message) 8 time = content['time'] 9 itemName = content['itemNum'] 10 volume = content["volume"] 11 price = content["price"] 12 df.loc[1]=[ time,itemName,volume,price] 13 df.to_csv('~~~~.csv') 14 15def on_error(ws, error): 16 print('--- ERROR --- ') 17 print(error) 18 19def on_close(ws): 20 print('--- DISCONNECTED --- ') 21 22def on_open(ws): 23 print('--- CONNECTED --- ') 24 def run(*args): 25 while(True): 26 line = sys.stdin.readline() 27 if line != '': 28 print('closing...') 29 ws.close() 30 31 _thread.start_new_thread(run, ()) 32 33url = '~~~~' 34 35ws = websocket.WebSocketApp(url, 36 on_message = on_message, 37 on_error = on_error, 38 on_close = on_close) 39ws.on_open = on_open 40ws.run_forever()
試したこと
on messageで毎回csvに保存するのではなく,
dataframeにいれるだけにして、最後にまとめてCSVに入れられないかと思ったのですが、
最後にWebsocketに渡しているため、方法がわからずつまずいてしまいました。
どうぞよろしくお願いいたします。
回答1件