0

私はPythondict形式のアーカイブデータをたくさん持っており、jsonに変換するために取り組んでいます。可能であればこのプロセスをスピードアップすることに興味があり、誰かが何か提案があるかどうか知りたいです。現在私:

  1. 「複数のファイルで」gzip圧縮されたデータを取り込む
  2. それらを1行ずつ読んでください
  3. astでliteral_evalを実行します
  4. jsonダンプを使用して、必要なjson文字列を作成します
  5. 行の日付を照会する
  6. 検出された日付で指定された追加用のファイルを開きます
  7. 文字列をファイルに書き込みます
  8. プロセス全体を再開します

これが私の現在の作業コードです:

import gzip
import ast
import json
import glob
import fileinput
from dateutil import parser

line = []

filestobeanalyzed = glob.glob('./data/*.json.gz')

for fileName in filestobeanalyzed:
        inputfilename = fileName
        print inputfilename # to keep track of where I'm at
        for line in fileinput.input(inputfilename, openhook=fileinput.hook_compressed):
                line = line.strip();
                if not line: continue
                try:
                        line = ast.literal_eval(line)
                        line = json.dumps(line)
                except:
                        continue
                date = json.loads(line).get('created_at')
                    if not date: continue
                date_converted = parser.parse(date).strftime('%Y%m%d')
                outputfilename = gzip.open(date_converted, "a")
                outputfilename.write(line)
                outputfilename.write("\n")

outputfilename.close()

これを行うためのより効率的な方法があるはずです、私はそれを見ていません。誰か提案はありますか?

4

1 に答える 1

1

最初にhttp://packages.python.org/line_profiler/でプロファイルを作成します。これにより、タイミングが1行ずつ表示されます。マルチスレッド化を試みたり、マルチプロセッシングプールを使用したり、ファイルのリストを関数にマップしたりすることもできます。

IOが問題になるかもしれないと感じていますが、これもファイルのサイズによって異なります。

# Assuming you have a large dictionary across a multi-part gzip files.
def files_to_be_analyzed(files):
    lines = ast.literal_eval("".join([gzip.open(file).read() for file in files]))
    date = lines['created_at']
    date_converted = parser.parse(date).strftime('%Y%m%d')
    output_file = gzip.open(date_converted, "a")
    output_file.write(lines + "\n")
    output_file.close()

私はまだあなたが何を達成しようとしているのかよくわかりませんが、IOはキラーなので、できるだけ少ない回数で読み書きを試みてください。複数のディレクトリで作業する必要がある場合は、次のようにマルチスレッド化することを検討してください。

import gzip
import ast
import json
import glob
import fileinput
from dateutil import parser
from multiprocessing import Pool

# Assuming you have a large dictionary across a multi-part gzip files.
def files_to_be_analyzed(files):
    lines = ast.literal_eval("".join([gzip.open(file).read() for file in files]))
    date = lines['created_at']
    date_converted = parser.parse(date).strftime('%Y%m%d')
    output_file = gzip.open(date_converted, "a")
    output_file.write(lines + "\n")
    output_file.close()

if __name__ == '__main__':
    pool = Pool(processes = 5) # Or what ever number of cores you have
    directories = ['/path/to/this/dire', '/path/to/another/dir']
    pool.map(files_to_be_analyzed, [glob.glob(path) for path in directories])
    pools.close()
    pools.join()
于 2012-06-12T05:05:19.127 に答える