建议的方法将stdin行批处理到另一个重复命令,比如xargs但是通过stdin而不是参数?

goj*_*omo 2 linux bash xargs gnu-coreutils

我有一个数据导入脚本,它读取行并将它们添加到数据库,到目前为止一直很好.不幸的是,脚本(或其运行时或数据库库或其他)中的某些东西是内存泄漏,因此大型导入使用单调增加的主内存,导致交换缓慢,然后内存耗尽的进程死亡.将导入分为多次运行是一种解决方法; 我一直这样做,split然后在每个部分上执行导入脚本的循环执行.

但我宁愿跳过分割文件,这感觉它应该是一个单行.事实上,似乎应该存在一个等价于xargs将行传递给stdin上的指定命令,而不是作为参数.如果这个假设命令是xlines,那么我希望以下内容为myimportgiantfile.txt中每批最多50,000行运行脚本:

cat giantfile.txt | xlines -L 50000 myimport
Run Code Online (Sandbox Code Playgroud)

我是否xlines在某个其他名称下缺少类似的功能,或隐藏在其他命令的选项中?或者可以xlines用几行BASH脚本完成?

Mar*_*ell 7

使用GNU Parallel - 可在此处获得.

您将需要该--pipe选项以及--block选项(它采用字节大小,而不是行数).

有点像:

cat giantfile.txt | parallel -j 8 --pipe --block 4000000 myimport
Run Code Online (Sandbox Code Playgroud)

(那是选择50,000行的块大小*80字节= 4000000,4m这里也可以缩写.)

如果您不希望作业实际并行运行,请更改81.或者,你可以完全放弃它,它将为每个CPU核心运行一个作业.

您也可以cat通过运行来避免

parallel ... < giantfile.txt
Run Code Online (Sandbox Code Playgroud)

  • --pipe -L 给出以行为单位的记录大小。你想要的是 --pipe -N (记录数 - 一条记录默认为 1 行)。但 --block 效率更高(大约 100 MB/s)。而且 --pipepart(从版本 20140622 开始)仍然更高效(大约 3 GB/s)。 (2认同)