如何加速mongoDB应用程序的shell脚本?

时间:2014-06-12 13:52:54

标签: json mongodb shell parallel-processing bigdata

我为自己的工作开始编写shell脚本,但我必须承认,即使是新手也离我很远。因此,我想请你帮忙/建议。

我为大数据应用程序构建了一个脚本(采用快速而肮脏的方法,将来自互联网的东西一起修补)以递归方式通过文件夹结构并将所有XML文件转换为JSON。

我的脚本的现状是:

#!/bin/sh
# Shell script to find out all the files under a directory and
#its subdirectories. This also takes into consideration those files
#or directories which have spaces or newlines in their names

cd /Users/q337498/Desktop/Archiv/2014/01/10

DIR="."

function list_files()
{
if !(test -d "$1")
then echo $1; return;
fi

cd "$1"
#echo; echo `pwd`:; #Display Directory name

for i in *
    do
        if test -d "$i"; then # if dictionary
            if [ "$(ls -A $i)" ]; then
                list_files "$i" #recursively list files
                cd ..
            else
               echo "$i is Empty"
            fi
        else
            java -jar /Users/q337498/Desktop/XML2JSON/SaxonEE9-5-1-4J/saxon9ee.jar -s:"$i" -xsl:/Users/q337498/Desktop/xsltjson-master/conf/xml-to-json.xsl -o:output/$(pwd)/${i%%[.]*}
#            if jsonlint /Users/q337498/Desktop/Archiv/2014/01/08/$(pwd)/${i%%[.]*} -q; then
#                echo "GOOD"
#            else
#                echo "NOT GOOD"
#            fi
#          echo ${i%%[.]*}
#          echo "$i"; #Display File name
        fi
    done
}

if [ $# -eq 0 ]
    then list_files .
    exit 0
fi

for i in $*
    do
        DIR="$1"
        list_files "$DIR"
        shift 1 #To read next directory/file namedone
    done

此代码有效,但问题是对于60000个文件,在16GB RAM和2.8 Ghz i7的macbook pro上需要长达15个小时。我需要转换1000万个文件。

您认为我如何加速剧本?并行?拿出一些命令?我有什么选择,我将如何实际实现它们?

这些文件最终会以MongoDB结尾,所以如果有人知道将xml转换为json并将其上传到mongo的更好方法,那么他的输入也是受欢迎的。

干杯,

嘟嘟

1 个答案:

答案 0 :(得分:0)

我在这里看到2个直接问题:

  1. 您正在为每个文件调用一次java,因此会导致每个文件的JVM启动时间增加到很长一段时间。
  2. 您正在运行单线程
  3. 所以我建议你:

    • 编写一个执行目录遍历并进行转换的Java程序
    • 基准性能差异
    • 尝试其他Java库来执行XML-> JSON转换https://github.com/beckchr/staxon/wiki/Benchmark
    • 如果需要提高性能,请使用java.util.concurrent向应用程序添加多线程。