Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R data.table中的列槽_R_Data.table - Fatal编程技术网

R data.table中的列槽

R data.table中的列槽,r,data.table,R,Data.table,我有一个数据集x,有350m行和4列。从一个包含13m行和19列的数据集i连接两列时,我遇到以下错误: Internal logical error. DT passed to assign has not been allocated enough column slots. l=4, tl=4, adding 1 我已经检查过了,但问题似乎出在列的数量上。因为我只有几个,如果这就是问题所在,我会感到惊讶 此外,我还发现,错误与“列槽”有关,但我不理解它们是什么。检查truelength时,

我有一个数据集
x
,有350m行和4列。从一个包含13m行和19列的数据集
i
连接两列时,我遇到以下错误:

Internal logical error. DT passed to assign has not been allocated enough column slots. l=4, tl=4, adding 1
我已经检查过了,但问题似乎出在列的数量上。因为我只有几个,如果这就是问题所在,我会感到惊讶

此外,我还发现,错误与“列槽”有关,但我不理解它们是什么。检查truelength时,我获得

> truelength(x)
[1] 0
> truelength(i)
[1] 0

我的理解是设置,例如,
alloc.col(x,32)
alloc.col(i,32)
,或两者都可以解决问题。然而,我不明白这是怎么回事,也不明白问题是什么。有人能解释一下吗?

部分原因是
数据。table
在内存使用方面非常有效(而
base
数据。帧在常规使用中往往会被左右复制,例如设置
名称(DF)=col_names
实际上可以复制所有
DF
,尽管只操作对象的属性)

反过来,部分原因是
data.table
总是在内存中分配一定的大小,以便更流畅地添加/减去列指针(从内存的角度来看)

因此,当实际列贪婪地占用内存时(当它们被创建时,声称有足够的内存来存储
nrow(DT)
-大小向量),列指针,它存储查找实际数据的地址(如果你不知道指针的详细信息,你可以想到这个~like~列名),创建时具有固定的内存插槽

alloc.col
强制执行列指针地址保留过程;这在两种情况下最常用:

  • 您的数据需要很多列(默认情况下,分配给1024个指针的空间比定义中的列多)
  • 您已从RDS加载数据(因为
    readRDS
    /
    load
    不知道为
    数据分配此内存。表
    加载后,我们必须自己触发此操作)

  • 我认为弗兰克是对的,你正在经历后者。有关更多详细信息,请参见
    ?alloc.col
    ,但在大多数情况下,您应该只运行
    alloc.col(x)
    alloc.col(i)
    ——除了高度受限的机器之外,分配1024个列指针需要相对较少的内存,所以你不应该花太多的精力去浏览和试图找出正确的数量。

    部分原因是
    数据。table
    在内存使用方面非常有效(而
    base
    数据。帧
    通常会被左右复制,例如设置
    名称(DF)=col_names
    实际上可以复制所有
    DF
    ,尽管只操作对象的属性)

    反过来,部分原因是
    data.table
    总是在内存中分配一定的大小,以便更流畅地添加/减去列指针(从内存的角度来看)

    因此,当实际列贪婪地占用内存时(当它们被创建时,声称有足够的内存来存储
    nrow(DT)
    -大小向量),列指针,它存储查找实际数据的地址(如果你不知道指针的详细信息,你可以想到这个~like~列名),创建时具有固定的内存插槽

    alloc.col
    强制执行列指针地址保留过程;这在两种情况下最常用:

  • 您的数据需要很多列(默认情况下,分配给1024个指针的空间比定义中的列多)
  • 您已从RDS加载数据(因为
    readRDS
    /
    load
    不知道为
    数据分配此内存。表
    加载后,我们必须自己触发此操作)

  • 我认为弗兰克是对的,你正在经历后者。有关更多详细信息,请参见
    ?alloc.col
    ,但在大多数情况下,您应该只运行
    alloc.col(x)
    alloc.col(i)
    ——除了高度受限的机器之外,分配1024个列指针需要相对较少的内存,因此,您不应该花费太多的精力来略读和试图找出正确的数量。

    您熟悉
    vignette(“datatable常见问题解答”)中关于“从RDS或RData文件读取data.table”的注释吗?根据我的经验,truelength 0来自加载的表。当然
    ?alloc.col
    可能是一个可以查看的地方,如果您想知道它的功能,谢谢,我会查看常见问题解答。我确实阅读了有关这些函数的文档,但我不明白这些插槽是什么。您是否熟悉
    vignette(“datatable faq”)
    中关于“从RDS或RData文件读取data.table”的说明?根据我的经验,truelength 0来自加载的表。当然
    ?alloc.col
    可能是一个可以查看的地方,如果您想知道它的功能,谢谢,我会查看常见问题解答。我确实阅读了关于这些函数的文档,但我不明白这些插槽是什么。