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

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

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

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

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

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

shell 变量可以保存的长度是多少?

(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 定义)。在页面大小为 4 kB 的架构上,最大大小为 128 kB ……”

编辑:

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

建议:

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

相关内容