長いテキスト出力をシェル変数のメモリに保存し、ディスクに書き込む

長いテキスト出力をシェル変数のメモリに保存し、ディスクに書き込む

100,000回繰り返し実行されるループ内で、db2データベース・コマンド行ツールに対して次の呼び出しを実行しました。

(db2の出力は、呼び出しごとに20文字で構成される約5行で、合計呼び出し数は約100,000です。SPへの入力は、SPの出力行の前に追加され、ログ・ファイルにダンプされます。

while read line
do
    db2 -x "call stored_procedure_XYZ($line)" |sed "s/^/$line/" >>log_file.txt
done<$infile

ループでsedとディスクへの書き込みを実行して、プロセス全体をより速く実行したいと思います。すべての出力を変数に保存してから変更してディスクに書き込むことをお勧めしますか?

シェル変数はどのくらい保存できますか?

(Bash, AIX 6.1)

ベストアンサー1

Bash変数のサイズは固定されていません。 mallocが十分なメモリと連続したアドレス空間を見つけることができる場合は、任意の量のデータを保存できます。変数に多くのデータを保存するとしましょう。変数ファイルにデータを書き込もうとすると、次のエラーが発生する可能性があります。

/bin/echo ${LARGE_DATA} >> ${YourFile}    
/bin/echo: Argument list too long

このエラーは、コマンド・パラメーターの最大長に関連しています。確認してくださいパラメータサイズと環境制限execve のマニュアルページの説明に従ってhttp://man7.org/linux/man-pages/man2/execve.2.html

「… 環境および引数文字列を格納するために使用されるメモリは32ページに制限されています(カーネル定数MAX_ARG_PAGESとして定義されています)。ページサイズが4kBのアーキテクチャでは、最大サイズは128kBです。 … 」

編集する:

また、上記の/bin/echoエラーは単なる例であり、ファイルへの書き込み中に別の方法を試してみると、同様のエラーが発生する可能性があります。パラメータサイズに関連しています。

提案:

ファイル書き込み操作がアトミックであると考えると、書き込み用にパイプが作成されるたびにファイル記述子が開いて閉じます。少し時間がかかります。 / bin / echoや他のプログラムを使用する代わりに、C / C ++などの高級言語で独自の「WriteFile」プログラムを作成できます。必要なのはI/Oリダイレクトです。

  1. オープンファイル記述子
  2. データ投入
  3. ファイル記述子を閉じる
  4. コードの最適化
  5. 完璧

    次のシステムコールを確認してください。 ssize_t write(int fd, const void *buf, size_t count);

    http://linux.die.net/man/2/write

おすすめ記事