2012-03-26 14 views
1

Ich muss R-Daten effizient über ein Netzwerk abrufen können. Der typische Datensatz, den ich abrufen möchte, besteht aus ein paar hunderttausend Zahlen.Numerische Daten mit reduzierter Genauigkeit

Ich verwende derzeit saveRDS zum Speichern der Daten und readRDS zum Abrufen, was mir eine anständige Leistung gibt. Aber einige der vorberechneten Ergebnisse können aufgrund der Tatsache, dass R jede Zahl in 4 Bytes speichert, immer noch im Dutzenden von MB-Bereichen enden. Für meine Anwendung brauche ich keine genauere Genauigkeit als eine 1 oder höchstens 2 Byte Ganzzahl, also denke ich, dass ich etwas Zeit sparen könnte, indem ich die Binärdaten in einem anderen Format speichern würde.

Ich konnte online nichts über effizientes Speichern von R-Daten in reduzierten Präzisionsformaten finden. Offensichtlich konnte ich in meinem eigenen Binärformat lesen und schreiben, aber ich stelle mir vor, dass der Overhead der Schleife, der das in R erledigt, alle Leistungsvorteile überwiegt, die ich durch die Reduzierung der Lese-/Übertragungszeit über das Netzwerk erreichen würde.

Hat jemand Erfahrung damit?

Antwort

2

Ich begann ein Paket zu schreiben, pack, um mit einem Problem wie diesem zu helfen. Ich benutzte es, um ein anderes Paket zu unterstützen, das eine API zu einem now-defunct service war. Wenn Sie nur eine 1-Byte-Ganzzahl (< 256) möchten, können Sie as.raw verwenden und das Ergebnis senden; Verwenden Sie dann as.integer auf dem Computer, der die Daten empfängt.

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

Für eine 2-Byte-Integer, können Sie pack verwenden und das Ergebnis senden; Verwenden Sie dann unpack auf dem Computer, der die Daten empfängt.

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

Ich habe es nie benutzt, aber ich habe über RProtoBuf gute Dinge gehört.

+0

Danke! 'as.raw' war nicht genug Genauigkeit für mich, aber der' short' Int in deinem Paket mag genau das Richtige! –

Verwandte Themen