[jq] 検索結果の一部だけを取得してメモリに優しいデータ検索を行う方法

2019年4月10日

jq テクノロジー プログラミング

WEBサービスや何かしらのツールを構築する時に、大体データの使用量を見積もる事があると思いますが、多くのエンジニアが使用量ボリュームを甘く見積もりがちです。 もちろん公開サービスなどで、ユーザーがデータを大量に登録することが仕様の場合は用意に想像できると思いますが、任意文字列(長文)なんかを登録できるようにした場合に、想像を絶するデータボリュームになってIOが追いつかないという障害に陥ることも多々あります。 これって「データベースの性能が悪いから」と決めつけて対策に、高額なデータベースシステムを組み込まないといけないというお寒い対応をしているエンジニアも結構いるそうですよ・・・ Googleの検索結果みたいに1ページに表示する件数をある程度絞ることで性能担保を行なうことは可能です。 いつものようにjqコマンドを使って、テキストデータのいち部を取得するやり方を理解して、便利で効率的なデータ設計を行えるようにしよう!!

slice処理の簡単リファレンス

jq .[*1:*2] data.json *1 : 開始Index *2 : 終了Index リファレンスページの記載 Array/String Slice: .[10:15] The .[10:15] syntax can be used to return a subarray of an array or substring of a string. The array returned by .[10:15] will be of length 5, containing the elements from index 10 (inclusive) to index 15 (exclusive). Either index may be negative (in which case it counts backwards from the end of the array), or omitted (in which case it refers to the start or end of the array). [example] jq '.[2:4]' Input ["a","b","c","d","e"] Output ["c", "d"] jq '.[2:4]' Input "abcdefghi" Output "cd" jq '.[:3]' Input ["a","b","c","d","e"] Output ["a", "b", "c"] jq '.[-2:]' Input ["a","b","c","d","e"] Output ["d", "e"]

注意事項とワンポイントアドバイス

1. Indexは0指定の数値 2. 終了Indexは、そのIndexの一つ手前までが対象になる。(for文で言うところの"<="ではなく"<"扱い) 3. 先頭にある"."(カンマ)の付け忘れに注意! 4. 配列以外に対しても使える。文字列で実行すると文字stringのバイトアドレスで結果が帰る。(2バイト文字の場合は?) 5. 数値をブランクで登録すると、*1の場合は"0"*2の場合は最終値扱いになる。 6. マイナス値で実行すると先頭からではなく後方からの番号になる。

こんな時に使える

データ容量が膨大で、取得した後のメモリ圧迫が不安になるような場合に、取得個数を制限取得して必要最低限のデータ取得が行える。 WEBページの検索結果リスト表示で行なう「ページネーション」処理の時の取得個数と取得開始先頭アドレスなどを指定する場合に便利に使える。 検索結果で多重配列のようなマトリクスデータが取得される場合、途中データの数値アドレス指定で取得する場合に、配列切り取りとしてslice機能が利用可能。

データ取得サンプルsample

data.json

{"key":1,"value":"aaa"} {"key":2,"value":"bbb"} {"key":3,"value":"ccc"} {"key":4,"value":"ddd"} {"key":5,"value":"eee"} {"key":6,"value":"fff"} {"key":7,"value":"ggg"} {"key":8,"value":"hhh"} {"key":9,"value":"iii"} {"key":10,"value":"jjj"}

コマンド実行と結果

$ jq --slurp '.[2:4]' data.json [ { "key": 3, "value": "ccc" }, { "key": 4, "value": "ddd" } ] $ jq --slurp '.[:4]' data.json [ { "key": 1, "value": "aaa" }, { "key": 2, "value": "bbb" }, { "key": 3, "value": "ccc" }, { "key": 4, "value": "ddd" } ] $ jq --slurp '.[8:]' data.json [ { "key": 9, "value": "iii" }, { "key": 10, "value": "jjj" } ] $ jq --slurp '.[-2:-1]' data.json [ { "key": 9, "value": "iii" } ]

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。