開発

gsutilで"argument list too long"エラーが出る原因

gsutil で argument list too long エラーが出る原因

コマンドラインからGoogle Cloud Storage (GCS) を操作することができる gsutil パッケージ。

複数のファイルをGCPにコピーする場合は gsutil cp コマンドを並列に処理する為に gsutil -m cp といった感じで使う。

しかしあるとき以下のようなエラーが発生した。

Argument list too long

この Argument list too long エラーは何故発生したのか。
回避する方法はあるのか。

今回はそんな問題を解決するために、「gsutilで"argument list too long"エラーが出る原因」を解説する。

この記事を書いている人


からさん
システムエンジニア、AIエンジニアと、IT業界で10年以上働いている中堅。PythonとSQLが得意。最近GCP環境を習得中。

記事を読むメリット

  • gsutilで"argument list too long"エラーが出る原因と対処方法がわかる

  • gsutilで"argument list too long"エラーが出る原因

    実は Argument list too long エラーはgsutilのエラーではない

    このエラーはもっと手前の bashzsh で発生するエラーである。

    意味はエラーメッセージをそのまま翻訳した通り「引数が長すぎる」こと。

    このエラーが発生する例として以下のようなコマンドを実行しているはずだ。

    gsutil -m cp ./* gs://mybucket/mydir
    



    問題は * ワイルドカードの部分。

    ワイルドカードを指定した際に、シェル側で条件に合致するファイルをひたすらコマンドの引数として渡す。

    が、この「条件に合致するファイル」の数が多すぎる場合に Argument list too long となってしまう。



    gsutilで"argument list too long"エラーの回避方法

    原因はワイルドカードで指定した引数が多すぎるからとして、どうやってエラーを回避すればいいのか

    エラーの回避方法は実は単純で、ワイルドカードで指定している引数をダブルクオートで囲むことで回避できる。

    gsutil -m cp "./*" gs://mybucket/mydir
    
    少年
    ほとんど同じに見えるんですけど・・・
    チガウヨ。ゼンゼンチガウヨー。
    からさん
    ""で括ることで『*』をそのままテキストとしてgsutilに渡してるんですよ
    からさん

    こうすることでワイルドカードの処理がシェルではなくgsutilの方で行われるようになる。
    gsutilの方がワイルドカードの処理の仕方がスマートなので Argument list too long エラーは起こらなくなる。

    エラーになる場合
    gsutil -m cp ./* gs://mybucket/mydir

    ./*

    ./ にある全ファイルを抽出して gsutil コマンドに引数として渡す

    エラーにならない場合
    gsutil -m cp "./*" gs://mybucket/mydir

    "./*"

    "./*" のまま gsutil コマンドに引数として渡す

    gsutilの中で"./*"の判定を行う


    The "Argument list too long" error is coming from the shell, which has a limited size buffer for expanded wildcards. By quoting the wildcard you prevent the shell from expanding the wildcard and instead the shell passes that literal string to gsutil. gsutil then expands the wildcard in a streaming fashion, i.e., expanding it while performing the operations, so it never needs to buffer an unbounded amount of expanded text.

    (訳)
    「引数リストが長すぎます」エラーは、拡張ワイルドカード用の制限されたサイズのバッファがあるシェルから発生しています。ワイルドカードを引用することにより、シェルがワイルドカードを展開するのを防ぎ、代わりにシェルはそのリテラル文字列をgsutilに渡します。次に、gsutilはワイルドカードをストリーミング方式で展開します。つまり、操作の実行中にワイルドカードを展開するため、無制限の量の展開されたテキストをバッファリングする必要はありません。



    gsutilで"argument list too long"エラーが出る原因 まとめ

    gsutilで"argument list too long"エラーが出る原因は、シェルにワイルドカードで引き渡す引数が多すぎるから。

    解決方法としてはワイルドカードを含む引数を""で括る
    こうすることでワイルドカードをシェルではなくgsutilが処理をするのでエラーが起こらなくなる。



    他にもgsutilで並列コピーする際に TypeError が起こる場合の原因と対処方法についての記事もあるので、気になった方は見て欲しい。

    コチラもオススメ

    KRSW

    駆け出し機械学習エンジニア。機械学習、DB、WEBと浅く広い感じ。 Junior machine learning engineer. Not a specialist but a generalist who knows DB, WEB too.

    役に立ったらシェアしてくれると励みになります。

    にほんブログ村 IT技術ブログへ

    -開発
    -,

    Translate »

    Copyright© ITips , 2020 All Rights Reserved.