如何在 R 中保存和加载 bigmemory::big.matrix 对象?
How can I save and load a bigmemory::big.matrix object in R?
我试图在我的 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 对象实际上是指向其他内存的指针,实际上只是在保存一个指针。有什么办法可以解决这个问题吗?
(我真的不想使用文件支持的 big.matrix 对象,因为我实际上要保存的对象是一个包含一个或多个 big.matrix 对象的复杂数据结构,所以然后我需要为对象中包含的每个 big.matrix 提供一个支持文件,然后该对象将被序列化为不确定数量的文件,而不仅仅是一个。)
但是 big.memory
对象位于外部指针后面,因此它们 在 R 的控制之外。这意味着您将它们保存为 RDS 对象的想法 from R 从一开始就注定要失败。
您可以将它们转换为普通对象占用大量内存,然后写为 RDS。否则也许看看 filebased.bigmatrix()
?
你可以试试
> saveRDS(describe(x), "bigmem-test.RDS")
> y <- attach.big.matrix(readRDS("bigmem-test.RDS"))
虽然我不确定您打算实现什么。以上将在同一个 R 会话中工作。但是如果没有文件支持,你在内存中的任何东西都会在你结束 R 会话后消失,上面的内容将不起作用,因为它指向的任何东西都会消失。
我试图在我的 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 对象实际上是指向其他内存的指针,实际上只是在保存一个指针。有什么办法可以解决这个问题吗?
(我真的不想使用文件支持的 big.matrix 对象,因为我实际上要保存的对象是一个包含一个或多个 big.matrix 对象的复杂数据结构,所以然后我需要为对象中包含的每个 big.matrix 提供一个支持文件,然后该对象将被序列化为不确定数量的文件,而不仅仅是一个。)
但是 big.memory
对象位于外部指针后面,因此它们 在 R 的控制之外。这意味着您将它们保存为 RDS 对象的想法 from R 从一开始就注定要失败。
您可以将它们转换为普通对象占用大量内存,然后写为 RDS。否则也许看看 filebased.bigmatrix()
?
你可以试试
> saveRDS(describe(x), "bigmem-test.RDS")
> y <- attach.big.matrix(readRDS("bigmem-test.RDS"))
虽然我不确定您打算实现什么。以上将在同一个 R 会话中工作。但是如果没有文件支持,你在内存中的任何东西都会在你结束 R 会话后消失,上面的内容将不起作用,因为它指向的任何东西都会消失。