2012-03-26 4 views
1

Мне нужно иметь возможность эффективно извлекать R-данные по сети. Типичный набор данных, который я пытаюсь получить, состоит из нескольких сотен тысяч номеров.Сокращенные точные числовые данные

В настоящее время я использую saveRDS для хранения данных и readRDS, чтобы получить его, что дает мне достойную производительность. Но некоторые из предварительно вычисленных результатов все же могут оказаться в десятках мегабайтных диапазонов из-за того, что R хранит каждое число в 4 байта. Для моего приложения мне больше не нужна точность, чем 1 или, самое большее, 2 байта целого числа, поэтому я думаю, что я мог бы сэкономить некоторое время, сохранив двоичные данные в другом формате.

Я не смог найти что-либо в Интернете о эффективном хранении данных R в прецизионных форматах. Очевидно, что я мог читать и писать в/из моего собственного двоичного формата, но я предполагаю, что накладные расходы на цикл, выполняемые в R, намного перевесят любые преимущества в производительности, которые я получаю за счет сокращения времени чтения/передачи по сети.

У кого-нибудь есть опыт?

ответ

2

Я начал писать пакет, pack, чтобы помочь с подобной проблемой. Я использовал его для поддержки другого пакета, который был API для now-defunct service.

Если вам просто нужно 1-байтовое целое число (< 256), вы можете использовать as.raw и отправить результат; затем используйте as.integer на машине, получающей данные.

> as.raw(255) 
[1] ff 
> as.integer(as.raw(255)) 
[1] 255 

Для 2-байтового целого числа, вы можете использовать pack и отправить результат; затем используйте unpack на машине, получающей данные.

> library(pack) 
> pack("v", 255) 
[1] ff 00 
> pack("v", 256) 
[1] 00 01 
> unpack("v", as.raw(255)) 
[[1]] 
[1] 255 

Я никогда не использовал его, но я слышал хорошие вещи о RProtoBuf.

+0

Спасибо! 'as.raw' была недостаточно полной для меня, но' short' int в вашем пакете может сделать только трюк! –

Смежные вопросы