linux - 将 stdin 行批处理到另一个重复命令的推荐方法,例如 xargs 但通过 stdin 而不是参数?

标签 linux bash xargs gnu-coreutils

我有一个数据导入脚本,可以读取行并将它们添加到数据库中,到目前为止一切顺利。不幸的是,脚本(或其运行时或数据库库或其他)中的某些内容存在内存泄漏,因此大量导入使用单调增加主内存,导致交换速度缓慢,然后内存耗尽进程死亡。将导入分成多个运行是一种解决方法;我一直在用 split 做这件事,然后在每个片段上循环执行导入脚本。

但我宁愿跳过制作拆分文件,这感觉应该是 1-liner。事实上,似乎应该有一个等价于 xargs 的东西,它将行传递给 stdin 上的指定命令,而不是作为参数。如果这个假设的命令是 xlines,那么我希望下面的命令为 giantfile.txt 中的每批最多 50,000 行运行 myimport 脚本:

cat giantfile.txt | xlines -L 50000 myimport

我是否遗漏了以其他名称命名的类似于 xlines 的功能,或者隐藏在其他命令的选项中?或者 xlines 可以在几行 BASH 脚本中完成吗?

最佳答案

使用 GNU Parallel - 可用 here .

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

类似的东西:

cat giantfile.txt | parallel -j 8 --pipe --block 4000000 myimport

(即选择 50,000 行 * 80 字节 = 4000000 的 block 大小,这里也可以缩写为 4m。)

如果您不希望作业实际并行运行,请将 8 更改为 1。或者,您可以完全忽略它,它会在每个 CPU 内核上运行一个作业。

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

parallel ... < giantfile.txt

关于linux - 将 stdin 行批处理到另一个重复命令的推荐方法,例如 xargs 但通过 stdin 而不是参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25760282/

相关文章:

linux - 如何向 SBT 添加插件? [Ubuntu]

python - 是否可以与/dev/bus/usb/<bus>/<device> 进行串行通信

linux - 如何使用 bash 别名作为命令行参数

linux - 我怎样才能在 linux 的命令中间用 xargs 传递所有参数

Python 安装,找不到 bz2 模块

c - 从TCP套接字接收用户和密码并检查

bash - sed 模式在字符后插入逗号

linux - Bash 匹配二进制模式

bash - find -print0 和 xargs -0 开关是否有等效的 grep?

linux - 显示父目录中文件的内容