2011-08-12 5 views
2

JSON形式のデータをいくつか表示しています。データ(約10MBのJSON)はかなり高速に読み込まれますが、使用可能な形式に再構成するには、わずか10万行未満で数分かかります。私は働くものを持っていますが、もっとうまくいくと思います。JSONデータを変換するパフォーマンスの問題

私のsample dataで始まると分かりやすいかもしれません。

あなたは/tmpで次のコマンドを実行しますと仮定:

curl http://public.west.spy.net/so/time-series.json.gz \ 
    | gzip -dc - > time-series.json 

あなたがここに(しばらくして)私の所望の出力を見ることができるはずです。

require(rjson) 

trades <- fromJSON(file="/tmp/time-series.json")$rows 


data <- do.call(rbind, 
       lapply(trades, 
         function(row) 
          data.frame(date=strptime(unlist(row$key)[2], "%FT%X"), 
             price=unlist(row$value)[1], 
             volume=unlist(row$value)[2]))) 

someColors <- colorRampPalette(c("#000099", "blue", "orange", "red"), 
           space="Lab") 
smoothScatter(data, colramp=someColors, xaxt="n") 

days <- seq(min(data$date), max(data$date), by = 'month') 
smoothScatter(data, colramp=someColors, xaxt="n") 
axis(1, at=days, 
     labels=strftime(days, "%F"), 
     tick=FALSE) 
+1

以下のアルゴリズムの答えは、最大のスピードアップの原因ですが、RJSONIOがいくつかのテストでrjsonよりも高速であることがわかりました(さまざまなJSON構造を解析する際の信頼性が向上しました)。同様に試してみる価値があるかもしれません - 使い方は同じです。 – Noah

+0

ポインタありがとう。私はかなり恣意的に選んだ。 – Dustin

答えて

5

plyrを使用すると、40倍のスピードアップを得ることができます。ここにコードとベンチマーク比較があります。データフレームを取得したら、これまでの変換を行うことができます。したがって、リンゴとリンゴの比較を容易にするためにコードから削除しました。私はより速い解決策が存在すると確信しています。

f_ramnath = function(n) plyr::ldply(trades[1:n], unlist)[,-c(1, 2)] 
f_dustin = function(n) do.call(rbind, lapply(trades[1:n], 
       function(row) data.frame(
        date = unlist(row$key)[2], 
        price = unlist(row$value)[1], 
        volume = unlist(row$value)[2])) 
       ) 
f_mrflick = function(n) as.data.frame(do.call(rbind, lapply(trades[1:n], 
       function(x){ 
        list(date=x$key[2], price=x$value[1], volume=x$value[2])}))) 

f_mbq = function(n) data.frame(
      t(sapply(trades[1:n],'[[','key')),  
      t(sapply(trades[1:n],'[[','value'))) 

rbenchmark::benchmark(f_ramnath(100), f_dustin(100), f_mrflick(100), f_mbq(100), 
    replications = 50) 

test   elapsed relative 
f_ramnath(100) 0.144  3.692308  
f_dustin(100) 6.244  160.102564  
f_mrflick(100) 0.039  1.000000  
f_mbq(100)  0.074  1.897436 

EDIT。 MrFlickのソリューションは3.5倍のスピードアップをもたらします。私はテストを更新しました。

+0

私はこれからかなり学んだ。どうもありがとう。 :) – Dustin

+0

クール。 100k行を処理する際に得たスピードアップをお知らせください! – Ramnath

+0

mbqに関する注意:私たちがstrptimeを後処理しているにもかかわらず、少なくとも日付列を抽出する必要があります。 – Dustin

0

は、オプションをバッチ処理されていますか?おそらくあなたのjsonの深さに応じて、一度に1000行を処理します。本当にすべてのデータを変換する必要がありますか?私はrについて確かではなく、正確にあなたが扱っているものはわかりませんが、私は一般的なアプローチを考えています。

また、これを見てください:http://jackson.codehaus.org/:高性能JSONプロセッサ。

+0

うーん、うまくいけば何でもいいですが、私は〜100k行が変換の一部を実行するのが難しいとは思わないでしょう。私はプロットのためにすべての結果データを一度に必要とします。行は、日付、価格、音量など、あなたが見るものとほぼ同じです。ソースのせいでJSONの周りにたくさんのJSONがありますが、ソースは本当に便利です。 – Dustin

+0

あなたは生成するjsonのバッチを使ってプロットを更新し続けることはできませんか? – Baz1nga

+0

私は分かりませんが、正直なところ、それは不必要だと感じています。 JSONの読み込みには数秒かかります。完全なプロットを生成するのに約1秒かかります。 JSONデータを取得し、 'smoothScatter'にフィードできるものに変換するのには数分かかります。それは別の方法がなければならないようです。 – Dustin

3

私はかなり速く、ここで言及する価値があったIRCでMrFlickによって別の変換を受けた:

data <- as.data.frame(do.call(rbind, 
           lapply(trades, 
            function(x) {list(date=x$key[2], 
                price=x$value[1], 
                volume=x$value[2])}))) 

インナーフレームを構築していないことにより、大幅に高速化しているようです。

+0

はい。彼のソリューションは私の3.5倍です。ベンチマークの比較を更新しました。あなたが私の答えに「受け入れられない」ことができれば、私たちはもっと速い解決策を得ることができればいいですね!! – Ramnath

+0

まだデータを受け取ることはできませんが、あなたのデータはすべてのバリエーションを含めて本当に素晴らしい分析です。本当にありがとう。 – Dustin

3

非常に非効率な単一要素に対してベクトル化演算を実行しています。

t(sapply(trades,'[[','value')) 

そして、このような日付:価格とボリュームは次のように抽出することができ

strptime(sapply(trades,'[[','key')[c(F,T)],'%FT%X') 

は今だけ、いくつかの砂糖と完全なコードは次のようになります。私のノートオン

data.frame(
strptime(sapply(trades,'[[','key')[c(F,T)],'%FT%X'), 
t(sapply(trades,'[[','value')))->data 
names(data)<-c('date','price','volume') 

を全体のセットは約0.7秒で変換されますが、最初の10k行(10%)は元のアルゴリズムを使用して8秒頃です。

+0

素晴らしいアプローチですが、mrflickによる解決策はまだ2倍くらいです。 – Ramnath

+0

@Ramnath大きなデータでベンチマークを試してみてください。私のバージョンが約500行でmrflickを追い越し、フルセットで1.5倍の速度が少し遅くなっています。 – mbq

+0

@Ramnath mbqのソリューションで 'as.data.frame'を使用している私のマシンでは、100行ですら最速になります。また、余分な行を使うほど余裕が大きくなります。 – joran

関連する問題