はじめに
この記事は記事タイトルの趣旨に関係のない所謂冗長なコードとなってしまっているので書き直しました。以下の記事へ飛んでいただけると幸いです。
実験の講義で大容量のcsvファイルをなるべく高速に検索するシステムを作ることになり、Pythonを使うことにした。ちなみにPythonは動作がありえん遅いためこの課題には不適切だけどとにかくPythonが使いたかった。
使用機材
RaspberryPi
Python3.X
コード
import csv
import pandas as pd
df = pd.read_csv('True.csv',chunksize = 8000000,names=('id','time','lati','long','url','tag'),usecols=['time','lati','long','url','tag'])
for r in df:
for row_index,row in r.iterrows():
if row[4] == sys.argv[1]:
for i in range(0,4):
print(row[i])
コード自体は短い。Pythonで大容量ファイルを使うなんてことはそうそうないから他にも普通にopen csvして一行ずつ読み込んだり試したけどどうも動作が遅いしスマートなコードにならなかったからやめた。
コードの説明
今回はpandasライブラリを使った。大容量に強いらしいし。
まずpandasを使ってファイルを読み込む。この時、chunksizeでファイルを分割する。usecolsで使うカラムを指定。iterrows()を用いてリスト形式で出力。sys.argv[]はphpのexec()関数から渡された値(この場合だとユーザが打ち込んだ検索ワード)が検索対象のタグと一致した時に~って処理をしてる。一致したらそのデータ出力という処理が全体の概要。
緑字の説明
chunksizeは一回で何行データを読み込むかを指定する。例えば今回の実験では2000万行のcsvファイルを扱ったが、chunksizeを1000万と指定すれば1000万×2回に分割、400万と指定したら400万×5回に分割することができる。なぜそんなことをする必要があるのかというと、メモリにのらないほどの大容量ファイルだと一度に読み込もうとすると読み込むことができない。そこでファイルをメモリにのる程度に分割することで大容量ファイルでも読み込むことを可能とする。当然分割するファイルが多いほど(chunksizeが小さいほど)実行速度は遅くなってしまうため使用機材のメモリが許す限り大きな値に設定すべきである。今回使ったラズパイ君は1GBしかメモリがないからchunksizeもとても小さくなってしまい(100万ぐらい)、結局思ったより早くならなかった。もっとメモリが大きかったりファイルが小さかったりしたらいい感じになったかも。
もしよければ↓ぽちっと↓お願いします。