2

R コードで big.matrix オブジェクトを使用しようとしていますが、 を使用してそれらをファイルに保存するのに問題がありますsaveRDS。これは通常、オブジェクトを保存する方法です。

> library(bigmemory)
Loading required package: bigmemory.sri
Loading required package: BH

bigmemory >= 4.0 is a major revision since 3.1.2; please see packages
biganalytics and and bigtabulate and http://www.bigmemory.org for more information.

> x <- big.matrix(5, 2, type="integer", init=0,
+ dimnames=list(NULL, c("alpha", "beta")))
> saveRDS(x, "bigmem-test.RDS")
> y <- readRDS("bigmem-test.RDS")
> y
An object of class "big.matrix"
Slot "address":
<pointer: (nil)>

> print(y[])

 *** caught segfault ***
address 0x51, cause 'memory not mapped'

Traceback:
 1: .Call("GetMatrixAll", x@address)
 2: GetAll.bm(x)
 3: .local(x, ...)
 4: y[]
 5: y[]

Possible actions:
1: abort (with core dump, if enabled)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace
Selection: 3

saveRDS は、 big.matrix オブジェクトが実際には他のメモリへのポインターであり、事実上ポインターを保存しているだけであることを何らかの形で認識できていないと思います。これを回避する方法はありますか?

(実際に保存したいオブジェクトは、1 つ以上の big.matrix オブジェクトを含む複雑なデータ構造であるため、ファイルに基づく big.matrix オブジェクトは実際には使用したくありません。そのため、big.matrix オブジェクトごとにバッキング ファイルが必要になります。 .matrix がオブジェクトに含まれている場合、オブジェクトは 1 つではなく、不確定な数のファイルにシリアル化されます。)

4

2 に答える 2

1

あなたが試すことができます

> saveRDS(describe(x), "bigmem-test.RDS")
> y <- attach.big.matrix(readRDS("bigmem-test.RDS"))

私はあなたが何を達成しようとしているのか分かりません。上記は同じ R セッション内で機能します。しかし、ファイルのバッキングがなければ、R セッションを終了した後にメモリ内にあるものはすべて失われ、それが指しているものはすべて失われるため、上記は機能しません。

于 2016-02-16T06:06:58.123 に答える
0

ただし、big.memoryオブジェクトは外部ポインターの背後にあるため、 R の制御外になります。つまり、R からRDS オブジェクトとして保存するという考えは、最初から運命づけられているということです。

それらを多くのメモリを消費する通常のオブジェクトにキャストしてから、RDS として書き込むことができます。そうでなければ、多分調べますfilebased.bigmatrix()か?

于 2015-09-30T19:31:31.940 に答える