2019の13日目の記事です。Wordの操作」でした。ちなみに、全然関係ないですけど今日って13日の金曜日なんですね!!結論(伝えたいこと)Tie::Fileを使うと、ファイルの行に直接アクセスできる。大容量ファイルへアクセスするときに便利。読み込み時のキャッシュを多くすれば、ディスクI/Oを低減できてスピードアップする。きっかけプログラミング課題で、「省メモリで大容量のCSVファイルを短時間で処理するためのバッチプログラムを書いてほしい」というものがありました。単純にメモリに格納するのでは効率が悪いと考えて色々試していたところ、Tie::Fileモジュールを使うとファイルの中身をすべてメモリに展開せず、ファイルに行指定でアクセスできることを知りました。課題には、「外部のミドルウェア(RDBなど)に頼らず、プログラムで処理すること」と制約があったので、「それならこんな感じかなぁ。」と思い、書いてみました。モジュールの公式ドキュメントはこちらです。課題の内容ざっくり言うと、以下の3条件を満たすプログラムを書くことです。joinをやる」という意味です。joinの内部表を作るときに使います。$!";memoryを明示的に指定すると、キャッシュをデフォルトの2MBから変更することができます。今回は、20MBに調整してファイルI/Oの削減を試みました。@array2にはファイルの行情報が格納されているので、スカラで評価するとファイルの行数が取得できます。適当な所で区切りながら、内部表を作ります。データは配列形式で格納されているため、ファイルの1行目は0になります。}指定した列をキー、キーが存在する行番号を値にしたハッシュを作成します。これで、値に一行丸ごと挿入しなくて良くなるので省メモリになります。実際のコードでは、比較したいカラムを予めソートしておいたり、一回で読み込むと1GBを超えてしまったので適当なところで区切りを入れたりしていますが、割愛してます。あとは、もう片方のファイルを駆動表としてforループで処理し、キーにマッチした行をFETCHしてゆけば良いです。実行環境では510secくらいで処理できました。メモリ使用量は700MBくらいでした。おわりになぜ全てメモリに展開せずに行を取り出すことができるのか、モジュールの実装を追って確かめてみたいと思います。泰明@omokawa_yasuPerlのカルチャーが好きです。