Wal*_*cio 3 csv memory-management r large-data ff
我正在使用配备 Intel Xeon 处理器和 24 GB RAM 的 64 位 Windows Server 2008 计算机。我在尝试读取 11 GB(>2400 万行,20 列)的特定 TSV(制表符分隔)文件时遇到问题。我平常的伙伴,read.table让我失望了。ff我目前正在通过以下过程尝试该软件包:
> df <- read.delim.ffdf(file = "data.tsv",
+ header = TRUE,
+ VERBOSE = TRUE,
+ first.rows = 1e3,
+ next.rows = 1e6,
+ na.strings = c("", NA),
+ colClasses = c("NUMERO_PROCESSO" = "factor"))
Run Code Online (Sandbox Code Playgroud)
这对于大约 600 万条记录来说效果很好,但随后我收到了一个错误,如您所见:
read.table.ffdf 1..1000 (1000) csv-read=0.14sec ffdf-write=0.2sec
read.table.ffdf 1001..1001000 (1000000) csv-read=240.92sec ffdf-write=67.32sec
read.table.ffdf 1001001..2001000 (1000000) csv-read=179.15sec ffdf-write=94.13sec
read.table.ffdf 2001001..3001000 (1000000) csv-read=792.36sec ffdf-write=68.89sec
read.table.ffdf 3001001..4001000 (1000000) csv-read=192.57sec ffdf-write=83.26sec
read.table.ffdf 4001001..5001000 (1000000) csv-read=187.23sec ffdf-write=78.45sec
read.table.ffdf 5001001..6001000 (1000000) csv-read=193.91sec ffdf-write=94.01sec
read.table.ffdf 6001001..
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
could not allocate memory (2048 Mb) in C function 'R_AllocStringBuffer'
Run Code Online (Sandbox Code Playgroud)
如果我没记错的话,R 会抱怨缺乏内存来读取数据,但是该read...ffdf过程不是应该在读取数据时避免大量内存使用吗?我在这里可能做错了什么?
(我意识到这是一个老问题,但我遇到了同样的问题,花了两天时间寻找解决方案。这似乎是一个很好的地方,可以记录我最终为后代找到的答案。)
问题不在于可用内存不足。问题是您已经达到了单个字符串的内存限制。来自帮助('内存限制'):
个别对象也有限制。存储空间不能超过地址限制,如果尝试超过该限制,则会出现错误消息无法分配长度向量。字符串的字节数限制为 2^31 - 1 ~ 2*10^9,这也是数组每个维度的限制。
就我而言(似乎也是您的情况),我没有费心去设置引号字符,因为我正在处理制表符分隔的数据,并且我认为这并不重要。然而,在数据集中间的某个地方,我有一个带有不匹配引号的字符串,然后 read.table 愉快地跑过行尾并继续到下一个,下一个,下一个......直到它达到了绳子尺寸的极限并爆炸了。
解决方案是quote = ""在参数列表中显式设置。