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の環境構築(windows)

先日まではJava案件がメインだったのですが、Perlの案件があり、これに取り組むことに。 で、とりあえずローカルに環境を構築しようと思いましたが、これがすげー大変でした。 PerlってCPANってラ …

no image

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

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

no image

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

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

no image

Perlの文字コードについて その3

実際のPerlでの文字処理に関しては以前の記事でも書いたように下記の原則を守ればOKです。  原則1 外部から入力された文字列はデコードして内部文字列に変換する  原則2 外部へ出力する文字列はエンコ …

no image

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

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

アーカイブ