在R

时间:2017-08-14 11:47:48

标签: r csv garbage-collection

我的任务是加载一个大的csv文件(9 gb)并提取一些特定的行并将这些特定的行保存在新的csv文件中。这个过程我正在做一个函数。因此,在我的控制台中,我使用source()命令加载我的函数,然后使用myfun()执行该函数。

超过csv文件6 gb我的电脑挂断。

我试过的解决方法没有成功:

  • How can I remove all objects but one from the workspace in R?

    • 因为我有一个函数,我的变量不在我的工作区中,所以我无法删除它们......
  • gc()命令

    • 此处的stackoverflow是本主题的一些不同帖子
    • 最近我使用gc()来释放我的记忆 - 它的工作原理
    • 但现在我需要我的三个变量(开始,数量和l) - 意味着并非所有变量都被允许删除
    • 在第五或第六个for循环计算机挂断
    • 注意:如果没有gc()命令,我只能到达第二个或第三个for循环
      • gc()命令有效

我的csv文件的附加说明:

  • 它有6列
  • 我需要提取每四十或第一百行
    • 我必须检测的行距离
    • 我不确定行距离是否在整个csv文件中保持不变

我的电脑是win7机器,内存为64位和16 MB。

现在我的问题是:有没有办法避免挂断?也许在我的代码中有一个更好的gc()位置或gc()的其他参数?

如果您需要更多信息,请发表评论 - 我将编辑我的帖子。

非常感谢提前!

现在我的代码:

    library(data.table)  # because of the fread() command

    myfun=function () {

    start=i
    quantity=2.2*10^7  # this is the number of rows and this amount is about 1.2 gb of the csv file
    for (l in 1:12) {  # the 12 is guessed… perhaps here exists also a better solution

        DT=fread("C:\\user1\\AllRows.csv",sep = ";",stringsAsFactors=FALSE,drop=7,header=FALSE,nrows= quantity,skip=start,data.table=FALSE)
        colnames(DT)=c("col_1"," col_2"," col_3"," col_4"," col_5"," col_6")

        # Detect the distance of rows and extract the corresponding rows
        # and save it in data.df

        # and now data.df will be saved
        file=file.path("C:\\user1\\ExtractedRows.csv"))
        if (l==1) {write.table(data.df,file=file,sep=";",dec=",",row.names=FALSE,col.names= c("col_1"," col_2"," col_3"," col_4"," col_5"," col_6"),append=FALSE)}
        if (l!=1) {write.table(data.df,file=file,sep=";",dec=",",row.names=FALSE,col.names=FALSE,append=TRUE)}

        # release the internal memory
        gc(reset=T)

        # incrementing start
        start = start + quantity

    }  # end of for loop

    }  # end of function

1 个答案:

答案 0 :(得分:0)

当处理数据太大而无法容纳在内存中时,您可以使用SQLlite将数据保存在磁盘上,然后查询您需要的内容。

以下是帮助您入门的参考资料:https://www.r-bloggers.com/r-and-sqlite-part-1/

这种方法可能比您在问题中列出的方法更适合您的问题。