Pythonは本当に必要か?Rustで作るデータパイプライン
はじめに 昨今のデータ基盤の流行りはELTだと思いますが、つまりT処理をBigQueryやSnowflakeといったDWHサービス上で実行してしまうケースが多く、ELはAPIやほかサービスからデータを引っこ抜いてDWHサービスに生データに近い形で登録しておきたいといったことがだいぶ多いのではないかと思っています。 そして最近はfivetran, troccoのような便利なSaaSもありその部分の実装を行う機会はだいぶ減ったとは思うのですが、それでもSaaSだと高い、オープンソースだと要件に合わないようなことも多くあり自前Pythonで実装だ!となることもまだまだあるのかと思います。 Pythonはデータ分野で超便利な言語で、チームのケイパビリティなどを考慮しても採用しやすいと思いますが、一方でしばしばシンプルな処理なのにメモリを食いつぶしツライ・・・みたいことが起こりがちだと思っています。 今回はデータパイプラインのEL処理をRustで実装することで、 どの程度性能面のメリットを得られる可能性があるのか? 実装はシンプルにできるのか? というところに焦点を当てて検証してみようと思います。 ※ Rustはこのために勉強した感じなので、色々とアレなところがあったらすみません(自衛) パフォーマンス比較 まずシナリオとして以下を想定して実験してみます ローカルにあるCSVをBigQueryにinsert BQ Loadではなく、メモリ上でCSVを解釈し逐次insertする BQにロードするための前処理をすることが多いという想定(ロードした時刻の付与とか、UTF変換とか) とりあえず少しまとまったデータが欲しかったので、雑にPythonに作らせます(ChatGPTに作ってもらいました) データ生成用コード(Python) 1import csv 2import random 3import time 4 5# Configuration 6num_rows = 1_000_000 7output_file = "large_data.csv" 8 9# Define sample data 10names = ["Alice", "Bob", "Charlie", "David", "Eve"] 11countries = ["USA", "Canada", "UK", "Australia", "Germany", "Japan"] 12 13# Generate CSV 14start_time = time.time() 15with open(output_file, mode="w", newline="") as file: 16 writer = csv....