[Python(pypy)&Julia] gzファイルの読み込みパフォーマンス比較

2022/11/02に公開

背景

この使い方でJuliaが別に高速じゃないのは分かっていますが…。

処理の概要

  • ディレクトリにgzファイルが置かれている(000からfffまで4096ファイル分)
  • gzファイルの中身は文字列で、各行が1つのJSON文字列になっている
  • 1つ1つgzを開いて、今探索しているキーと同じキーが含まれているJSON文字列を探す
  • 抽出したJSON文字列に含まれているデータを集合に保存する

実装

大まかにこのような感じの実装になっています。Pythonとほぼ同じ処理をそのままJuliaでも書いています。Juliaで書くときは、最初にググって出てきた GZip.jl を使う実装と、その後google検索して出てきたCodecZlib.jlを使った実装、両方比較しました。

import glob
import gzip
import json
from tqdm import tqdm

def main(tuser):
    fn_ans = f"data/{tuser}.csv"
    ans_ids = set({})
    with open(fn_ans, "r") as f:
        for line in f:
            line = line.strip()
            ans_ids.add(int(line))
    
    # gzファイルから対象ユーザのphotoidを探索する
    all_user_ids = set({})
    for line in tqdm(sorted(glob.glob("data/meta/*"))):
        with gzip.open(line, "tr") as f:
            for line_j in f:
                line_j = line_j.strip()
                data = json.loads(line_j)
                uid = data["uid"]
                pid = int(data["photoid"])
                if uid == tuser:
                    all_user_ids.add(pid)

    # 結果の出力 (関係なし)
    print(len(ans_ids))
    print(len(all_user_ids))
    print(len(all_user_ids & ans_ids))


if __name__ == '__main__':
    tuser = "61585804@N00"
    main(tuser)

結果

ニコニコ動画見ながら片手間で測定しました(ふんわり)。

環境はM1 Mac (メモリ8GB) です。どちらもターミナルから普通にスクリプトを実行しました。

Python (pypy3)

M1 Macにpyenvを使って pypy3.9-7.3.9 をインストールして使いました。

100%|███████████| 4096/4096 [09:48<00:00,  6.96it/s]
python program.py  566.18s user 10.34s system 97% cpu 9:49.10 total

Julia

Julia version 1.6.7を使いました。

CodecZlib.jl版です。

100.0%┣████████████████████████████████████┫ 4.1k/4.1k [17:45<00:00, 4it/s]
/Applications/Julia-1.6.app/Contents/Resources/julia/bin/julia   1032.49s user 13.33s system 98% cpu 17:46.40 total

GZip.jl版です。遅すぎて実装がダメすぎるか、使い方間違ってる気がしてきましたね。

100.0%┣█████████████████████████████████┫ 4.1k/4.1k [01:12:46<00:00, 1s/it]
/Applications/Julia-1.6.app/Contents/Resources/julia/bin/julia program_gzip.j  3145.49s user 16.56s system 72% cpu 1:12:47.61 total

まとめ

普段使ってるUbuntu環境で測定したときはJuliaがpypy3を抜いたのですが、M1 Macでやったらpypy3に普通にボコられたので結論なしで終わります(情報なし)。実装(PythonとJuliaの書き捨てコード)はこちらです。

https://github.com/cocomoff/Compare_GZ_Reader

Discussion