![将较长的文本输出存储在 shell 变量的内存中与写入磁盘](https://linux22.com/image/34812/%E5%B0%86%E8%BE%83%E9%95%BF%E7%9A%84%E6%96%87%E6%9C%AC%E8%BE%93%E5%87%BA%E5%AD%98%E5%82%A8%E5%9C%A8%20shell%20%E5%8F%98%E9%87%8F%E7%9A%84%E5%86%85%E5%AD%98%E4%B8%AD%E4%B8%8E%E5%86%99%E5%85%A5%E7%A3%81%E7%9B%98.png)
我在循环内对 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 重定向。
- 打开文件描述符
- 写入数据
- 关闭文件描述符
- 优化您的代码
完毕
请检查系统调用,例如 ssize_t write(int fd, const void *buf, size_t count);