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での配列処理

最近Perlでの開発をやっているのでそこでのメモなどを書きます。 今まであまりやったことがなかったんですけど、やはり文字列や配列関連の処理をどうやるのかでいろいろと迷ったりします。 が、もともとテキス …

no image

Perlにおけるオブジェクト指向

今回はPerlのオブジェクト指向について。 Javaほどの厳密性はありませんが、Perlでもオブジェクト指向的なプログラミングを行うことは可能です。 今回はPerlのオブジェクト指向をさらっと基本的な …

no image

Perl整形ツール Perl Tidy

PHPでコード整形ツールを使いましたが、Perlでも整形ツールがあったのでちょっとメモ。 Perl::Tidyというモジュールです。 公式 http://perltidy.sourceforge.ne …

no image

Perlでの日付処理

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

no image

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

昨日書いたgrepに続き、mapについて調べたことを書いてみました。 Contents1 mapとは?2 mapを使った配列処理 基本3 mapを使った配列、ハッシュ処理 ハッシュを含む多次元配列への …

アーカイブ