0

ファイルを読み取り、データをリストにプッシュするための Python コードがいくつかあります。次に、このリストをキューに入れ、スレッドを使用してリストを処理します。たとえば、一度に 20 個のアイテムを処理します。処理後、結果を新しいファイルに保存します。新しいファイルに入れられたものは、実際には元のファイルとは異なる順序でした。たとえば、私は入力に、

    1a
    2b
    3c
    4a
    5日

しかし、出力は次のようになります。

    2 単三
    1バ
    4 単三
    5 日
    約3

元の順序を維持する方法はありますか? これが私のコードです:

    インポート スレッド、キュー、時間、sys
    クラス eSS(threading.Thread):
        def __init__(自己、キュー):
            threading.Thread.__init__(self)
            self.queue = キュー
            self.lock = threading.Lock()
        定義 (自己、電子メール、コード、提案、コメント、理由、dlx_score):
            #何かをする
        デフォルト実行 (自己):
            True の間:
                情報 = self.queue.get()
                infolist = info.split('\t')
                電子メール = インフォリスト[1]
                コード = 情報リスト[2]
                提案=情報リスト[3]
                コメント = 情報リスト[4]
                理由=インフォリスト[5]
                dlx_score = (0 if infolist[6] == 'NULL' else int(infolist[6]))
                g.write(info + '\t' + self.ess(電子メール、コード、提案、コメント、理由、dlx_score) +'\r\n')
                self.queue.task_done()

    if __name__ == "__main__":
        キュー = Queue.Queue()
        ファイル名 = sys.argv[1]
        #スレッド数の定義
        スレッド = 20
        f = open(ファイル名,'r')
        g = open(ファイル名+'.eSS','w')
        行 = f.read().splitlines()
        f.close()
        開始 = time.time()
        for i in range(threads):
            t = eSS(待ち行列)
            t.setDaemon(真)
            t.start()
        行の行の場合:
            queue.put(行)     
        queue.join()
        print time.time()-start
        g.close()

4

1 に答える 1

4

3つの考えが浮かびます。すべてに共通するのは、処理のためにキューに入れられるパケットにインデックスを含めることです。

  • その場合の 1 つの考えは、コントローラー/ワーカー/出力フレームワークを使用することです。このフレームワークでは、出力スレッドがワーカーによって処理されたデータをキューから取り出し、組み立てて、出力します。
  • 2 番目の考えは、出力にメモリ マップト ファイルを使用し、インデックスを使用してファイルに書き込むオフセットを計算することです (おそらく固定長の書き込みを想定しています)。
  • 3 つ目は、インデックスを使用して処理されたデータを新しいリストに入れ、リストが完成したらその場ではなく最後に項目を書き出すことです。
于 2013-04-02T15:45:36.523 に答える