【问题标题】:How to split a large variable?如何拆分大变量?
【发布时间】:2014-02-14 18:38:19
【问题描述】:

我正在处理大型变量,使用 while read line 在它们之间“循环”可能会非常慢,我发现变量越小运行速度越快。

如何将大变量拆分成较小的变量,然后一一读取?

例如, 我想达到的目标:

bigVar=$(echo "$bigVar" | split_var)

for var in "${bigVar[@]}"; do
  while read line; do
    ...
  done <<< "${var}"
done

或者可以拆分为 bigVar1、bigVar2、bigVar3 等,然后一一读取。

【问题讨论】:

  • $bigVar 中有哪些数据?你能举个具体的例子吗?最好不要一开始就在变量中存储大量数据。
  • 不要使用 split_var 或 echo bigvar,只需将 IFS 设置为您要拆分的任何内容
  • 子字符串扩展呢? s="somebigvariable"; echo "${s:0:7} / ${s:7}" .. 或者for ((i=0; i&lt;${#s}; i+=3)) { echo "${s:i:3}"; }

标签: linux bash loops variables large-data


【解决方案1】:

如果 BigVar 由单词组成,您可以使用 xargs 将其拆分为不超过命令行最大长度的行,通常为 32kb 或 64kb:

someCommand|xargs|while read line
do
    ...
done

在这种情况下,xargs 使用其默认命令,即echo。

我很好奇您想在 while 循环中做什么,因为它可能会使用管道进行优化。

【讨论】:

    【解决方案2】:

    而不是做

    bigVar=$(someCommand)
    while read line
    do
       ...
    done <<< "$bigVar"
    

    使用

    while read line
    do
       ...
    done <   <(someCommand)
    

    这样,你就完全避免了大变量的问题,someCommand 可以毫无问题地输出千兆字节。

    如果您将其放入变量中的原因是要在其上执行多个步骤,请将其重写为管道。

    【讨论】:

    • 只是好奇,为什么第一种方法比第二种方法慢?
    • 第一种方法会从进程中读取并反复重新分配变量以将其全部保存在内存中,这会花费越来越多的时间变量越大。然后它复制数据以进行字符串扩展,并必须将其提供给 while read 命令。只有这样,while read 才能开始阅读。使用第二种方法,命令输出直接馈送到循环中,让它更快启动并减少总工作量。
    • 感谢您的解释。所以第一种方法必须在while 循环的每次迭代中复制"$bigVar",因为它不知道自上次迭代以来它($bigVar)是否发生了变化?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2019-06-11
    • 1970-01-01
    相关资源
    最近更新 更多