skillup

技術ブログ

Perl

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

投稿日:2016年1月27日 更新日:

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

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

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

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

基本的な考え方

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

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

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

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

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

プログラムA

プログラムB

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

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

Perl/DBIを使ってMySQLでSELECT文を実行する

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

プログラムA

プログラムB

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

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

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

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

バッファクエリと非バッファクエリ

-Perl
-

執筆者:


comment

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

関連記事

no image

Perlの文字コードに関して その2

前回のエントリーでPerlで文字列を扱う場合は内部文字列に変換しなくてはいけないことを学びました。 Contents1 内部文字列を使うわけ2 文字コードの変換 内部文字列を使うわけ ところで何のため …

no image

Perlでの変数、配列、ハッシュに関して ~リファレンスなど~

こちらのブログでプログラミングを教えてるんですけど、プログラミングの基本といえば配列とオブジェクト指向だと思います。 もちろん、これ以外のことも大切ですが、初心者のうちはここを抑えておけばとりあえず何 …

no image

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

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

no image

Perlでの日付処理

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

no image

Vagarant+Eclipse(Perl)での作業環境構築

現在の案件でPerlの改修があるんですが、windowsだとモジュールの依存関係でうまくコンパイルできなかったりといろいろとトラブルが起こったんで、今はやりの仮想環境でやることに。 まだ完ぺきではない …