大量のデータを含むファイルがあります。各行はレコードです。そして、ファイル全体に対していくつかの ETL 作業を実行しようとしています。現在、標準入力を使用してデータを 1 行ずつ読み取っています。これの優れた点は、スクリプトが非常に柔軟で、他のスクリプトやシェル コマンドと統合できることです。結果を標準出力に書き出します。例えば。
$ cat input_file
line1
line2
line3
line4
...
私の現在のpythonコードは次のようになります - parse.py
import sys
for line in sys.stdin:
result = ETL(line) # ETL is some self defined function which takes a while to execute.
print result
以下のコードは、現在どのように機能しているかです。
cat input_file | python parse.py > output_file
Python の Threading モジュールを見てきましたが、そのモジュールを使用するとパフォーマンスが劇的に向上するかどうか疑問に思っています。
質問 1:各スレッドのクォータをどのように計画すればよいですか? なぜですか?
...
counter = 0
buffer = []
for line in sys.stdin:
buffer.append(line)
if counter % 5 == 0: # maybe assign 5 rows to each thread? if not, is there a rule of thumb to determine
counter = 0
thread = parser(buffer)
buffer = []
thread.start()
質問 2:複数のスレッドが同時に結果を stdout に出力する場合があります。それらを整理して以下の状況を回避するにはどうすればよいですか?
import threading
import time
class parser(threading.Thread):
def __init__ (self, data_input):
threading.Thread.__init__(self)
self.data_input = data_input
def run(self):
for elem in self.data_input:
time.sleep(3)
print elem + 'Finished'
work = ['a', 'b', 'c', 'd', 'e', 'f']
thread1 = parser(['a', 'b'])
thread2 = parser(['c', 'd'])
thread3 = parser(['e', 'f'])
thread1.start()
thread2.start()
thread3.start()
出力は非常に見苦しく、1 つの行に 2 つのスレッドからの出力が含まれています。
aFinished
cFinishedeFinished
bFinished
fFinished
dFinished