2014-10-30 77 views
2

我使用大型R對象進行工作,這些R對象有時會被我們本地網絡上的多個人以只讀方式訪問。例如,參考類或R6 object可能用於存儲與特定模型相關的驗證結果,並且它可能有許多隻讀驗證相關的方法。我希望繼續使用R來保持工作流的同質性,並避免轉向語言(比如Java或Python),這樣更適合解決我即將提出的問題。R有沒有「memcpy」?

而不是重新實例化,這些物品或串行輸出(例如,RDS或redis)每次我們需要他們在一個新的R會話時間去閱讀他們,這將是更有效地保留一些服務器上運行的活性R-過程可在網絡上訪問,然後從該服務器將「memcpy」對象加載到本地計算機上:某種類型的準確模式object pooling。注意這些有時是合法的非表格R對象,這些對象很難例如翻譯成database-backed object(可能仍然較慢)。

我知道R維護堆中範圍內的所有信息,所以這可能在沒有gc控制的情況下很難做到,但是可能在一個字節上「虹吸」遠離其他R會話的對象使用某種潛在的C魔法逐字節級別?我不太瞭解R如何管理內存中的對象以知道如何做到這一點,但也許有一個或一些現有代碼片段可以提供靈感。

我也願意穿上緊身衣,並對上述對象進行限制,這會使這項任務變得更加簡單(例如,只能引用特定的包,或者方法定義不能是令這個任務變得不可能的怪異閉包,甚至只能是S3對象)。

編輯:我只是意識到我沒有看着RProtoBuf。這可能合適嗎?

+0

也許R控制檯的修改版本,可以連接到一個R「服務器」的地方,並是根據引擎罩交談該會話,同時保持不同的用戶空間和可用於傳遞對象像一個共享空間這個。 – 2014-10-30 03:20:17

+1

你描述的內容與古典'memcpy'很少有關 - 具有網絡功能的'memcpy'也可以串行化對象並通過線路發送,類似於你使用RDS對象所做的事情。那麼爲什麼不使用後者呢?你說這效率不高,但我沒有看到任何先驗原因。 – 2014-12-08 22:29:42

回答

4

標準的方式做,這將是你的序列化對象轉換成字節流,可以安全地裝在另一臺機器上,在以後的時間。這正是base::serialize方法適用於R的情況,或者如果數據需要在使用其他語言編寫的應用程序之間共享的情況下,則適用base::serialize。在任何一種情況下,您都可以將序列化的字節寫入RDS或redis或任何其他數據存儲。

直接memcpy機器之間將是許多原因的問題。最根本的是,如果不是所有的計算機都具有相同的字節序,機器之間的體系結構差異會使這種錯誤容易發生。此外,您必須找到一種方法將複雜數據結構表示爲可在另一臺計算機上解釋的字節流。也許東西被加載到內存中的不同地址,所以你不能只是指望在不修復指向不同內存位置的指針的情況下執行原始memcpy,但如果你這樣做了,那麼你正在做序列化,所以爲什麼不使用base::serializeRProtoBuf

+2

很好的答案,+1。 RcppRedis軟件包也處理所有這些,並且隨着副作用的產生,RApiSerialize軟件包讓我們在C/C++ API級別進行R的序列化。 – 2014-12-08 22:34:30