情報学部大学生のダラダラ日記

β日記

機械学習や日記っぽいものを書きます

Python3で大容量のcsvファイルを分割して読み込む

スポンサーリンク

はじめに

この記事は記事タイトルの趣旨に関係のない所謂冗長なコードとなってしまっているので書き直しました。以下の記事へ飛んでいただけると幸いです。

parco1021.hatenablog.com

 

実験の講義で大容量の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万ぐらい)、結局思ったより早くならなかった。もっとメモリが大きかったりファイルが小さかったりしたらいい感じになったかも。

もしよければ↓ぽちっと↓お願いします。

ブログランキング・にほんブログ村へにほんブログ村 PVアクセスランキング にほんブログ村

 

 

 

スポンサーリンク