RJSONIO против rjson — лучшая настройка

ОБНОВЛЕНИЕ:

tl;dr заключается в том, что RJSONIO больше не является более быстрым из двух вариантов. Скорее rjson теперь намного быстрее.

См. комментарии для дополнительного подтверждения результатов


У меня сложилось впечатление, что RJSONIO должен был быть быстрее, чем rjson.
Однако я получаю противоположные результаты.

Мой вопрос:

  • Есть ли какая-либо настройка, которую можно/нужно выполнить для улучшения результатов RJSONIO? (т.е. я что-то упускаю из виду?)

Ниже приведены сравнения с использованием реальных данных (где U — это содержимое веб-страницы json), а затем смоделированного json.

## REAL DATA
library(microbenchmark)
> microbenchmark(RJSONIO::fromJSON(U), rjson::fromJSON(U))

Unit: milliseconds
                  expr       min        lq    median        uq      max
1   rjson::fromJSON(U)  29.46913  30.16218  31.74999  34.11012 158.6932
2 RJSONIO::fromJSON(U) 175.11514 181.67742 186.52871 195.90646 414.6160

> microbenchmark(RJSONIO::fromJSON(U, simplify=FALSE), rjson::fromJSON(U))
Unit: milliseconds
                                    expr       min       lq    median        uq        max
1                     rjson::fromJSON(U)  27.92341  28.7430  29.60091  30.63291 1 143.9478
2 RJSONIO::fromJSON(U, simplify = FALSE) 173.30136 179.5815 183.94315 190.17245 2 328.8996

Пример с фиктивными данными

(Похожие результаты)

# MOCK DATA
U <- toJSON(list(1:10, LETTERS, letters, rnorm(20)))

microbenchmark(RJSONIO::fromJSON(U), rjson::fromJSON(U))
# Unit: microseconds
#                   expr     min       lq   median       uq      max
# 1   rjson::fromJSON(U)  94.788 100.8650 105.6035 111.0740 3457.479
# 2 RJSONIO::fromJSON(U) 520.131 527.7775 533.2715 555.2415  942.136

Пример 2 с набором данных iris

Iris.JSON <- toJSON(iris)

microbenchmark(RJSONIO::fromJSON(Iris.JSON), rjson::fromJSON(Iris.JSON))
# Unit: microseconds
#                           expr      min       lq   median       uq       max
# 1   rjson::fromJSON(Iris.JSON)  229.669  235.571  238.511  241.423   260.164
# 2 RJSONIO::fromJSON(Iris.JSON) 1209.607 1224.793 1232.165 1238.953 12039.772

> sessionInfo()
R version 2.15.1 (2012-06-22)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] data.table_1.8.8 stringr_0.6.1    RJSONIO_1.0-1    rjson_0.2.11

loaded via a namespace (and not attached):
[1] plyr_1.7.1

person Ricardo Saporta    schedule 09.03.2013    source источник
comment
Я проверяю ваш бенчмаркинг и подтверждаю результат (я использую simplify = FALSE для получения идентичных результатов). Что вы ожидаете в качестве ответа?   -  person agstudy    schedule 09.03.2013
comment
Можем ли мы получить полностью воспроизводимый пример? Потому что в моих настройках RJSONIO намного быстрее, чем rjson.   -  person dickoa    schedule 09.03.2013
comment
@dicko Был включен полный работоспособный пример. Возможно, он был пропущен, смешанный с эталонными тестами. Я разделил его, чтобы было более видно. Также добавлена ​​информация о сеансе.   -  person Ricardo Saporta    schedule 09.03.2013
comment
@agstudy, я ожидал, что результаты будут перевернуты, то есть RJSONIO будет намного быстрее. [Это основано на том, что я слышал о RJSONIO, и поэтому я пытаюсь подтвердить, действительно ли он медленнее или, скорее, я просто делаю что-то неправильно]   -  person Ricardo Saporta    schedule 09.03.2013
comment
@RicardoSaporta Я пытался, и кажется, что вы правы, и я несколько удивлен, потому что с данными радужной оболочки я получаю обратное. Посмотрите на это: stackoverflow.com/questions/8216743/how-to-read-big-json< /а>   -  person dickoa    schedule 09.03.2013
comment
Думаю, что раньше RJSONIO работал быстрее, но теперь rjson, похоже, превосходит его. Даже с наборами данных iris и выше. Возможно, это связано с какими-то настройками компилятора, хотя rjson тоже использует реализацию C начиная с 0.2.7 — так что это обновление производительности должно было произойти где-то год назад, а не сейчас.   -  person daroczig    schedule 09.03.2013
comment
@daroczig, я не уверен в его истории, но в настоящее время rjson превосходит RJSONIO в любом наборе данных, на котором я его тестирую.   -  person Ricardo Saporta    schedule 09.03.2013
comment
@RicardoSaporta: правильно, мы согласны с этим. Я только что написал об истории, так как год назад в феврале я довольно серьезно сравнивал два пакета, и RJSONIO, похоже, работал намного лучше. После этого я перестал следить за новостями о пакете rjson, что очень обидно, так как в марте (2012) он начал использовать C-реализацию парсера JSON - ИМХО, в то время он стал намного быстрее по сравнению с RJSONIO, который уже использовал C библиотека   -  person daroczig    schedule 10.03.2013
comment
@daroczig хорошее и ясное объяснение, я думаю, что ваш ответ должен был быть ответом.   -  person Michele    schedule 11.08.2013
comment
всем, кто найдет это › 2015, я настоятельно рекомендую jsonlite   -  person timelyportfolio    schedule 10.07.2015


Ответы (2)


> library('BBmisc')
> suppressAll(lib(c('RJSONIO','rjson','jsonlite','microbenchmark')))
> U <- toJSON(list(1:10, LETTERS, letters, rnorm(20)))
> microbenchmark(
+     rjson::toJSON(U),
+     RJSONIO::toJSON(U),
+     jsonlite::toJSON(U, dataframe = "column"),
+     times = 10
+ )
Unit: microseconds
                                      expr     min      lq      mean   median      uq       max neval cld
                          rjson::toJSON(U)  65.174  68.767 2002.7007  88.2675 103.151 19179.224    10   a
                        RJSONIO::toJSON(U) 299.186 304.832  482.8038 329.7210 493.683  1351.727    10   a
 jsonlite::toJSON(U, dataframe = "column") 485.985 501.381  555.4192 548.5935 587.083   708.708    10   a

Тестирование системы.время()

> microbenchmark(
+     system.time(rjson::toJSON(U)),
+     system.time(RJSONIO::toJSON(U)),
+     system.time(jsonlite::toJSON(U, dataframe = "column")),
+     times = 10)
Unit: milliseconds
                                                   expr      min       lq     mean   median       uq      max neval cld
                          system.time(rjson::toJSON(U)) 112.0660 115.8677 119.8426 119.8372 121.6908 132.2111    10  ab
                        system.time(RJSONIO::toJSON(U)) 115.4223 118.0262 129.2758 120.5690 148.5175 151.6874    10   b
 system.time(jsonlite::toJSON(U, dataframe = "column")) 113.2674 114.9096 118.0905 117.8401 120.9626 123.6784    10  a

Ниже приведено сравнение нескольких пакетов. Надеюсь, эти ссылки помогут...

1) Новый пакет: jsonlite. Умный кодер/декодер JSON.

2) Улучшенная память использование и совместимость RJSONIO в jsonlite 0.9.15

3) необъективное сравнение пакетов JSON в R

person Community    schedule 02.12.2015

https://cran.r-project.org/web/packages/jsonlite/vignettes/json-aaquickstart.html

Пожалуйста, попробуйте jsonlite, это самый быстрый в моем опыте для данных json, особенно вложенных

также см

https://rstudio-pubs-static.s3.amazonaws.com/31702_9c22e3d1a0c44968a4a1f9656f1800ab.html

person Ajay Ohri    schedule 28.03.2017