1. hoto17296

    Posted

    hoto17296
Changes in title
+Python で大量のファイルを並列で速く読み込む
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,43 @@
+些細なことでも [multiprocessing](https://docs.python.org/ja/3/library/multiprocessing.html) 使うと便利だよ、という小ネタ。
+
+## やりたいこと
+``` python
+from glob import glob
+
+files = glob('data/*.csv')
+
+len(files) # 40000
+```
+
+この 4万件の CSV ファイルを Pandas DataFrame として読み込みたい。
+
+## 普通に読み込む
+``` python
+import pandas as pd
+
+arr = [pd.read_csv(f) for f in files]
+```
+
+**約 59 秒** かかった。
+
+## 並列で読み込む
+[multiprocessing](https://docs.python.org/ja/3/library/multiprocessing.html) を使ってやってみる。
+
+`p.map` には `pd.read_csv` を直接渡したり `lambda` を渡したりすることはできないっぽいので、 `read_csv` という関数を定義している。
+
+``` python
+import pandas as pd
+from multiprocessing import Pool
+
+def read_csv(f):
+ return pd.read_csv(f)
+
+with Pool() as p:
+ arr = p.map(read, files)
+```
+
+**約 15 秒** で終わった。
+
+`Pool` は並列数を指定しなければ CPU のコア数で並列処理してくれるはずだけど、12 コア積んだマシンで実行しても 12 倍速くなるわけではなかった。
+
+しかし 4 倍速くなっただけでも十分ありがたい。