将更长的文本输出存储在内存中的 shell 变量与写入磁盘

dbz*_*bza 2 bash shell-script environment-variables db2

我在循环内对 db2 数据库命令行工具进行了以下调用,该循环运行 100k 次迭代。

(db2 的输出是每次调用大约 20 个字符的 5 行,总共大约 100k 个调用。SP 的输入以 SP 的输出行为前缀,并转储到日志文件中。)

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

我试图通过从循环内部取出 sed 和磁盘写入来使整个事情运行得更快。是否建议将所有输出存储在一个变量中,然后对其进行修改并将其写入磁盘?

shell 变量可以容纳的长度是多少?

(bash, aix 6.1)

Cun*_*ris 5

Bash 变量大小不固定。只要 malloc 可以找到足够的内存和连续的地址空间,它很可能会保存任意数量的数据。假设您在变量中存储了大量数据。当您尝试将数据写入您的文件,可能你会得到类似的错误

/bin/echo ${LARGE_DATA} >> ${YourFile}    
/bin/echo: Argument list too long
Run Code Online (Sandbox Code Playgroud)

此错误与命令参数的最大长度有关。请检查execve 手册页http://man7.org/linux/man-pages/man2/execve.2.html 中规定的参数大小和环境部分的限制

“... 用于存储环境和参数字符串的内存限制为 32 个页面(由内核常量 MAX_ARG_PAGES 定义)。在页面大小为 4-kB 的体系结构上,这产生的最大大小为 128 kB ...“

编辑:

另请注意,上述 /bin/echo 的错误只是一个示例,当您在写入文件时尝试其他方式时,可能会出现类似的错误。它与参数大小有关。

建议:

如果我们认为写入文件操作是原子的,每次生成管道进行写入,打开和关闭文件描述符。这需要一些时间。而不是使用 /bin/echo 或其他,您可以编写自己的“WriteFile”程序像 C/C++ 这样的高级语言。你需要的是 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