R 在data.table';弗雷德酒店

R 在data.table';弗雷德酒店,r,data.table,R,Data.table,我正在分块阅读一个大文件(约30GB),并注意到大部分时间是通过对整个文件执行行计数来完成的 Read 500000 rows and 49 (of 49) columns from 28.250 GB file in 00:01:09 4.510s ( 7%) Memory map (rerun may be quicker) 0.000s ( 0%) sep and header detection 53.890s ( 79%) Count rows (wc -l)

我正在分块阅读一个大文件(约30GB),并注意到大部分时间是通过对整个文件执行行计数来完成的

Read 500000 rows and 49 (of 49) columns from 28.250 GB file in 00:01:09
   4.510s (  7%) Memory map (rerun may be quicker)
   0.000s (  0%) sep and header detection
  53.890s ( 79%) Count rows (wc -l)
   0.010s (  0%) Column type detection (first, middle and last 5 rows)
   0.120s (  0%) Allocation of 500000x49 result (xMB) in RAM
   9.780s ( 14%) Reading data
   0.000s (  0%) Allocation for type bumps (if any), including gc time if triggered
   0.000s (  0%) Coercing data already read in type bumps (if any)
   0.060s (  0%) Changing na.strings to NA
  68.370s        Total
是否可以指定
fread
在每次读取块时不进行全行计数,或者这是必要的步骤

编辑: 下面是我正在运行的确切命令:

fread(pfile, skip = 5E6, nrows = 5E5, sep = "\t", colClasses = rpColClasses, na.strings = c("NA", "N/A", "NULL"), head = FALSE, verbose = TRUE)
我不确定您是否可以在fread中“关闭”wc-l命令。尽管如此,我还是有两个答案给你

回答1:在调用fread之前,使用Unix命令
split
将大数据集分解成块。我发现,在处理大数据集(即不适合RAM的数据)时,了解一点Unix有很大帮助


回答2:使用连接。不幸的是,这种方法不适用于fread。查看我以前的帖子,了解我使用连接的意思

您可以尝试较低级别的
扫描
。不清楚您正在运行哪个版本。我猜是1.9.4。你能试试吗?似乎和你说的一模一样。我不相信
fread
再使用
wc-l
,您仍然可以访问该文件吗?是否可以重新运行?可能需要提及
write.*
函数的“append”参数。@bonded我不知道
write.*
中的append选项在这种情况下有何帮助。你能详细说明一下吗?我假设当你将输入分割成段时,你试图构建一个不适合内存的大型csv文件。错误?@BondedDust我假设mkemp6试图加载数据块中的数据,分析数据,从内存中删除数据块,将结果保存在本地工作空间中,然后重复。我不喜欢mkemp6,我可能是错的,它在块中加载数据只是为了重新组合这些块(可能是在剔除多余的数据之后)。如果他这么做了,那么你的评论是有意义的。当然,对于简单的情况,Unix命令
cut
非常适合从大型数据集中剔除不必要的信息。
split -b 1m myfile.csv #breaks your file into 1mb chunks.