そこで、まず事前に行の開始位置を記憶しておいて、行を取得する時はその位置からデータを読み出すようにします。, まず、以下のようなクラスを定義します。 By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. What is going on with this article? Help us understand the problem. 2019/08/07 2020/11/03. ハードウェア アクセラレータは None を選択しています。 インスタンスの作成にかかる時間は「初期化」の行で示しています。, 特に行が多いと初期化に相応の時間がかかりますが、一度作成してしまえば読み出しは他の方法に比べるとかなり速いので、機械学習などでメモリに載り切らないデータを何度もロードしなければならない場合は有効な方法だと思います。, 比較的単純な方法ですが、意外とこのような情報が見つからなかったので記事にしてみました。 CSVは扱いやすいデータ保存形式ですが、非常に大きなデータを扱う場合には全てのデータをメモリに載せることができない場合があります。 このような場合、ファイルから1行ずつ読み込んで処理していくことになりますが、不特定の順でデータを取得したり、データを繰り返し取得する場合は非常に効率が悪くなります。 そこで、行数の大きいCSVファイルと列数の大きいCSVファイルを対象に、行番号指定で特定の行を読み出すにはどのような方法が効率的なのかを、簡単な実験を行なって検討してみ … 小児科医、AtCoder緑色. 「header=」でヘッダー(列名)にする行を指定 「index_col=」でインデックス(行名)にする列を指定 4. 各行の開始位置を offset_list に格納しています。offset_list のインデックスが行番号に対応しているので、seek()でその位置に移動してから行を読み出します。, 次のような結果になりました。 このくらいの大きさであればメモリに十分載りますが、今回は実験ですのでこれらを用います。, いくつかの方法で、各ファイルの最初の行の読み出しと最後の行の読み出しにかかる時間を測定しました。 2019年2月時点では以下の環境のようです。, 今回はデータの中身は使いませんが、どの行と列なのかが確認できるように (行インデックス)-(列インデックス)という形になっているデータを用いました。 特定の行を指定するための引数は用意されていないので、skiprowsで必要な行以外を除外しています。そのため、最初の行でも最後の行でも時間はあまり変わりません。, おそらくデータフレームを作成しているためでしょうが、行数の増加よりも列数の増加の方が負荷がかかります。, 行を取得した時点で処理を打ち切っているため、最初の行を取得する場合はPandasを使う場合より速くなっています。, you can read useful information later efficiently. 本来は「read」しなくてもいいのですが、純粋に行を進めるだけの方法はあるのでしょうか?, 普通はCSVをパースする場合はモジュールを使うべきですが、データが数値だけであることが保証されているような「綺麗な」データではモジュールでパースするよりも、単純にコンマでパースした方が効率がいいかもしれません。 Why not register and get more from Qiita? CSVは扱いやすいデータ保存形式ですが、非常に大きなデータを扱う場合には全てのデータをメモリに載せることができない場合があります。, このような場合、ファイルから1行ずつ読み込んで処理していくことになりますが、不特定の順でデータを取得したり、データを繰り返し取得する場合は非常に効率が悪くなります。, そこで、行数の大きいCSVファイルと列数の大きいCSVファイルを対象に、行番号指定で特定の行を読み出すにはどのような方法が効率的なのかを、簡単な実験を行なって検討してみました。, Google Colaboratory 上で実行しました。 以下の関数を使って読み出します。 そこで、split()でのパースを試してみます。, これでは差がわかりにくいので、LARGE COLUMNSの最初の行を100回取得する時間で比較してみます。, split()でパースした方が速いという結果になりました。 測定にはJupyter Notebook の %%timeit コマンドを用いました。, セルを5回繰り返し実行して平均を取るという処理を3回行い、そのうち一番成績のいいものが表示されます。, まずは普通にCSVファイルを読み込む場合によく使われるPandasを試してみます。 Pythonでは数行のコードでCSVファイルの読み書きを行うことができるのでPythonでCSVの操作をマスターすれば業務でも生かせる場面があるかもしれません。 トップページ > Python > Pythonを使ってCSVを操作(基礎編) Python. 香川大学医学部附属病院臨床研究支援センターで研究支援と医療情報関連業務に従事。
ヘッダ行はありません。また、行番号は0開始です。, となりました。 扱うデータによって使い分けると良さそうです。, ここまでの方法は一度だけデータを取得する場合はそれほど速度が気になりませんが、繰り返して行を取得する場合にはどうしてもある程度の時間がかかってしまいます。 次はこの点を改善します。, 行送りをファイルオブジェクトのreadline()に変更してみます。 データフレームをリストに変換する処理は行なっていません。, 単一の行を取得するには向いていませんが、複数の行をまとめて取得して、そのままデータフレームとして扱いたい場合はPandasが一番便利だと思います。, 次に、csvモジュールを使って特定の行を取得してみます。 以下の関数を使って読み出します。, のところで、行を毎回パースしているのが非常に無駄な気がします。 列数がそれほど大きくなければSQLite、列演算を行いたい場合はParquetなども選択肢に入ってくると思います。, 地味に役立つ記事を書くことを目標にしています。
まとめ.