skillup

技術ブログ

Perl

大容量データの取り込みについて

投稿日:

普段プログラムを組むときには可読性や保守性が大事なポイントになりますが、それと同じぐらい速度やメモリ効率なんかも大事です。

今回は少ないメモリでもなんとかできるような工夫をちょっとかいていこうかなと思います。

といいますか、普段からところどころやってはいたんですが、あまり意識せずにいたので、今回非常にお世話になることになりました。

自分がやっている開発はPerl何ですけど、多分どの言語でも同じかと思います。

基本的な考え方

テキストデータやデータベースなどある程度まとまった量の大きいデータを読み込むとき、それを一気に読み込むとメモリを圧迫し、PCに負担をかけます。

そこでデータを一気に読み込むのではなく、一定量ずつよみこめば負担は小さくなります。

例えば外部データに10万行のデータがあってここからプログラムを取り出すとき、一気に10万行とりこむのではなく、1000行ずつ頭から順番に取り出したほうが負担は少ないです。時間は遅くなります。

いってみると荷物の運搬のようなもので一度に大量の荷物を運ぶのではなく、小分けにして運べば時間はかかるかもしれませんが、少ない人数でも作業が可能ですね。

これが大体のイメージです。

プログラムA

プログラムB

プログラムAが一気に取り込んだもの、プログラムBが少しずつ取り込んだものになります。

プログラムを習い始めのころ、最初はBのコードを書く機会が多いと思いますが、こういった背景があったのだということを知っておいたほうが良いでしょう。

http://db.just4fun.biz/Perl/DBI%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6MySQL%E3%81%A7SELECT%E6%96%87%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B.html

似たような考え方としてテキストファイルから一定量のデータを取り出すといったことも同じ意図です。

プログラムA

プログラムB

一般的にはテキストファイルでも先ほどのデータベースと同じように、1行ずつとりだすケースが多いと思います。その場合はいいのですが、厄介なのは改行がなく、大量の文字列が保存されている場合などです(jsonの文字列など)。

その場合、データ量で少しずつ取り込むしかないので上記のプログラムのように、バイト数を指定してあげて対処をします。

PHPでもfgetsという関数でバイト数を指定できます。昔はこんな機能がどこで使うのだろう・・・と思っていたのですが、こういったところで活用していくわけですね。

今回の問題と似たことをあつかっているのがこちらの記事です。

http://php.net/manual/ja/mysqlinfo.concepts.buffering.php

-Perl
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

Perlでの動的改行コード読み込みに関して+cp932ネタ

本日はperlにて改行コードを動的に読み込む方法です。 Contents1 動的な改行コードの判定・読み込み2 ShitfJISとcp932について 動的な改行コードの判定・読み込み 実務で古いMAC …

no image

Perlでの日付処理

Perlで翌月の月末を求め、yyyyMMddで表示する計算があったので対応。 知識がなかったんで何気にちょい時間がかかりました。PerlではこのDateTimeというライブラリがよさげ。 [crayo …

no image

Perlの配列、ハッシュ系の処理(grepを中心に)

Perlの配列やハッシュで便利そうな処理をgrepを中心にいろいろ調べてみました。 Contents1 grepとは?2 grepを使った配列処理 基本3 grepを使った配列処理 ハッシュを含む多次 …

no image

Perlでのデータベース差分チェックツール

Perlにてデータベースの差分が発生したときに簡単に差分を埋めるためのSQLを書くライブラリがあったので紹介。 ライブラリがない場合、cpan SQL::Translator でまずライブラリをCPA …

no image

PerlでのCSV取込+金額のカンマ表示

CSV取込の場合、単純にカンマで区切って配列を取得するだけのロジックを実装すると様々な弊害が起きます。 よく見られるパターンとしては下記のようなケースでしょう。 フィールドの中に、カンマがあった場合、 …