读取大型数据集时R会话中止

时间:2018-02-14 17:00:01

标签: r data.table sparkr

我需要读取~2,000个csv文件(~500GB),然后过滤数据并将它们绑定在一起。当我只阅读~15,000个文件时,我的代码有效,但当我读取~20,000个文件时,它会提示“R会话中止”。

memory.limit(80000)
ReadCustomer = function(x)
 fread(x, encoding = "UTF-8", select = c("customer_sysno", "event_cat2")) %>%
  filter(event_cat2 == "***") %>%
  select(customer_sysno) %>%
  rename(CustomerSysNo = customer_sysno) %>%
  mutate(CustomerSysNo = as.numeric(CustomerSysNo)) %>%
  filter(CustomerSysNo > 0)
CustomerData = rbindlist(lapply(FileList, ReadCustomer))

我尝试将fread(x, encoding = "UTF-8", select = c("customer_sysno", "event_cat2"))替换为spark_read_csv(sc, "Data", x),但sparkR仍无效。 我怎样才能读取所有文件? Rcpp会帮忙吗?

1 个答案:

答案 0 :(得分:0)

你知道从每个文件中获得多少行,你不能说? 您实际上将此问题视为一种简单的过滤练习;您只需要满足特定条件的customer_sysno列。你想用它做什么会影响你是否想要将它们合并在一起。

我建议打开一个输出文件并将每个新输出附加到它。然后,您有一个包含所有所需customer_sysno值的本地文件。然后,您可以根据您的使用案例浏览或采样。

如果满足event_cat2条件的行实际上是每个文件的一小部分,并且每个文件都很大,那么另一种方法是readLine通过它们,也许结合将结果附加到输出文件。这基本上要求R做一个像(g)awk很棒的工作,所以这可能是一个有用的预处理步骤,可以获得所需的数据。