按代码列将R中的多个data.tables排序为相同数量的data.tables,而不绑定data.tables(由于内存限制)

按代码列将R中的多个data.tables排序为相同数量的data.tables,而不绑定data.tables(由于内存限制),r,performance,sorting,data.table,R,Performance,Sorting,Data.table,我有许多CSV包含大量数据,这些数据在集合中的所有CSV中都未经代码排序。我想对整个集合中的代码进行排序,将代码组一起保存到CSV中,使未排序时的CSV数量与以前相同我无法将它们绑定在一起、排序和拆分(就像我通常会做的那样),因为由于内存限制,我必须将CSV分开。我真正的数据集是数百个CSV上的数十亿行,就像这样 例如,如果fread后的每个数据表示例如下: 可复制数据: ###Really I would fread() each of these, but reproducible here

我有许多CSV包含大量数据,这些数据在集合中的所有CSV中都未经代码排序。我想对整个集合中的代码进行排序,将代码组一起保存到CSV中,使未排序时的CSV数量与以前相同我无法将它们绑定在一起、排序和拆分(就像我通常会做的那样),因为由于内存限制,我必须将CSV分开。我真正的数据集是数百个CSV上的数十亿行,就像这样

例如,如果fread后的每个数据表示例如下:

可复制数据:

###Really I would fread() each of these, but reproducible here
data1 <- data.table(code=rep(c(1:2000),times=500),
                   data1=rep(c(10001:12000),times=500), 
                   data2=rep(c(20001:22000),times=500))
data2 <- data.table(code=rep(c(1:2000),times=500),
                    data1=rep(c(10001:12000),times=500), 
                    data2=rep(c(20001:22000),times=500))
data3 <- data.table(code=rep(c(1:2000),times=500),
                    data1=rep(c(10001:12000),times=500), 
                    data2=rep(c(20001:22000),times=500))
data4 <- data.table(code=rep(c(1:2000),times=500),
                    data1=rep(c(10001:12000),times=500), 
                    data2=rep(c(20001:22000),times=500))
####我真的很想把每一个都放进去,但在这里可以复制

data1A
for
循环,顺序
rbind
将节省内存

out <- data1[code %in% 1:500]
for(i in 2:4) out <- rbind(out, get(paste0('data', i))[code %in% 1:500])
identical(out, desired1) 
#[1] TRUE 
out

这会在通过引用调用时更改原始数据。ie尝试调用
data2
您将看到它已更改。如果你不想要这个行为,你可以考虑使用函数<代码>拷贝<代码> IE>代码> SET(副本(x),…< /COD> < /P> > HMM。好的,让我仔细检查AkRunn,谢谢。这是一次性的问题。我想这是一次性的问题吗?还是你可能多次做的事情?为什么这是一个“速度”?关注点?作为一个一次性问题,我会先遍历所有数据,将整个文件范围内的
code
计数制成表格。这将帮助您计划哪些代码流向哪些文件。然后可能会在第二次遍历数据时使用
split.data.table
fwrite
append=TRUE
。您可以吗你根本不想平衡(即,你希望输出文件中的行数相似吗)?把每个代码放在自己的文件中(而不是把自己绑在匹配的输入和输出上)有什么不对这很好,但因为它在循环中迭代相当慢。因为它绑定并且我不想在内存中保存任何东西,因为这些数据非常大,所以我假设我们不能在I上与doFuture或mclapply并行,因为要不使用内存,它必须一个接一个地迭代?@NealBarsch或其他选项,如果你不使用它完整的数据集将在循环中包含write.csv并使用
append=TRUE
,这样您就不需要使用fwrite()创建大的“out”啊好主意从data.table上看,这些比write.csv好,fwrite也有附加功能。如果我这样做,我可能会使它并行,因为它只是附加功能,你同意吗?@NealBarsch是的,这将是个好主意,通过阅读评论,MichaelChirico在这些行中发表了评论
out <- data1[code %in% 1:500]
for(i in 2:4) out <- rbind(out, get(paste0('data', i))[code %in% 1:500])
identical(out, desired1) 
#[1] TRUE 
mm = function(x){
  a = table(x)
  rep(1:unique(a),length(a))
}

Map(function(x,y)set(x,j="code",value=mm(x[,code])+y),mget(ls(pattern = "data")),c(0,500,1000,1500))

$data4
         code data1 data2
      1: 1501 10001 20001
      2: 1502 10002 20002
      3: 1503 10003 20003
      4: 1504 10004 20004
      5: 1505 10005 20005
     ---                 
 999996: 1996 11996 21996
 999997: 1997 11997 21997
 999998: 1998 11998 21998
 999999: 1999 11999 21999
1000000: 2000 12000 22000