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