0

在我的项目中,我需要将一个大文件(~250GB)上传到远程服务器,然后运行脚本将文件加载到 mysql 中。问题是,如果我加载单个文件,它将花费太长时间。所以我必须将文件拆分成小树干,并在多个终端中同时运行 10-20 个进程。如果我拆分每个文件~2MB,我需要 100,000 次操作。然后我必须像

ruby importer.rb data_part01_aa.csv
ruby importer.rb data_part01_ab.csv
ruby importer.rb data_part01_ac.csv
.
.
.

在每个终端中,等待它们结束,然后运行下一个。

有什么方法可以自动化这个过程吗?任何 shell 脚本可以在前一个脚本完成后继续完成这项工作?非常感谢!

4

1 回答 1

0

在外壳中,您可以尝试:

for i in *.csv
do
    ruby importer.rb $i.csv
done

前一个可以写成一行如下:

for i in *.csv; do ruby importer.rb data_part01_aa.csv; done

最终,如果参数太多,可能需要一些时间才能开始运行。在这种情况下,您可以尝试find

find . -name '*.csv' -exec ruby importer.rb {} \;

但是,前面的命令将在每个子目录中递归搜索。要使其仅针对当前目录运行,您必须运行:

find . -maxdepth 1 -name '*.csv' -exec ruby importer.rb {} \;

在给出的每个示例中,命令将按顺序运行。*.csv您可以使用不同的模式(即a*.csv, b*.csv,[ab]*.*csv等)来代替,或者您可以尝试另一个循环:

for j in $(echo {a..q})
do
    find . -name "data_part01_$j?.csv" -exec ruby importer.rb {} \; &
done

Whereecho {a..q}生成从aq的字母序列,这似乎跟在您的文件名之后。最后一个示例中的关键是&,它将进程留在后台,在最后一个示例中,将有 17 个进程同时运行。如果您不想同时使用它们,那么您只需要删除 & 符号即可

于 2012-07-13T03:01:13.523 回答