上田隆一の仕事とか

なお、このサイトはbashでできている。

お知らせ: 日本機械学会教育賞を拝受いたしました /  詳解確率ロボティクス第5刷出ます /  シェルスクリプト高速開発手法入門改訂2版発売中 / 

opyを使ったCSV操作のベンチマーク

Sun Jul 4 13:43:37 JST 2021 (modified: Sun Jul 4 17:40:35 JST 2021)
views: 185, keywords: opy,シェル芸

  このエントリーをはてなブックマークに追加 

 Pythonでワンライナーを書くためのラッパーコマンドopyについて、CSVの読み書き機能のベンチマークをしてみました。1億行、4.2GBのCSVファイルを使いました。

 先に結論を書いておくと、grepawkを駆使する場合にくらべて時間はかかりますが、そこそこ妥当な速度で処理ができました。データの中に改行があるCSVデータを処理するときには有効です。

使ったマシン

Intel Core i9-10885H(物理コア8個)を搭載したThinkPad P1です。DRAMの量は64GB。

準備

 ベンチマーク用のデータをhttps://file.ueda.tech/DATA_COLLECTION/TESTDATA.gzから落とします。

内容を確認してから、CSV形式にします。

テスト1: 特定のデータだけ抽出

 3列目が富山県のデータだけを抽出してみましょう。

grep、awkの場合

 grepだと4秒弱で抽出できます。ただし、列の構成を無視できるのなら、これで十分です。awkの場合は-F,で2列目を指定すると、30秒ちょいかかりました。

$ time grep 富山県 TESTDATA.csv > ans

real    0m3.841s
user    0m3.181s
sys 0m0.573s
$ head -n 3 ans
7163,富山県,"1,371,974",1994年5月26日
2528,富山県,"6,407,486",1992年10月1日
1320,富山県,"5,784,634",2009年3月7日
$ time awk -F, '$2=="富山県"' TESTDATA.csv > ans

real    0m30.454s
user    0m29.714s
sys 0m0.676s

opyでCSVファイルを一度に読み込む場合

 3分30秒なので、awkの7倍くらいと、なかなか検討しています。

ただし、全部CSVをDRAMに読み込むので、めちゃくちゃメモリ使います。(この例だと46.1GBですね・・・)

opyでCSVファイルを一行ずつ読み込む場合

 次のように、-cを使うと1行ずつCSVとしてレコードを読んでくれる(さらに-CでCSVで出力してくれる)ので、DRAMもほぼ使わずワンライナーも短く書けるのですが、時間がかかります。

テスト2: 数字の前処理+大小比較

 3列目の数字からカンマを取って、絶対値が100万未満のレコードを抽出してみます。awkでも2分近くかかります。

 opyだと2倍強時間がかかりますが、データ構造をちゃんと見た上での作業時間なので、なかなか優秀です。ただし、DRAMはバカ食いしてます。

テスト3: ソート

 4列目の年月日でデータをソートしてみます。sortはファイルからデータを読むとコア数だけ並列処理してくれるので、一度中間ファイルに入れてからソートします。

 opyでやってみましょう・・・と挑戦したんですが、「そんなでかいデータ扱えるか💢」と叱られました。

妥協して1000万行のソートの結果を示しておきます。1千万件でコア1個だけ使って1分半なら、まあまあ妥当でしょう。

とりあえず以上です。



prev:jus共催 第54回シェル芸勉強会リンク集 next:opyを使ったCSV操作のベンチマーク





このサイトではGoogle Analyticsやその他ソーシャルボタンのためにCookieを使用しています。もし同意いただけない場合はブラウザでクッキーを無効にして閲覧をお願いします。This site uses cookies for Google AdSense and some social buttons. If you cannot accept our use of cookies, please disable cookies on your browser.