R无法在ff过程上分配内存。怎么会?

R无法在ff过程上分配内存。怎么会?,r,csv,memory-management,ff,large-data,R,Csv,Memory Management,Ff,Large Data,我正在一台64位Windows Server 2008机器上工作,该机器带有Intel Xeon处理器和24 GB RAM。我在尝试读取11GB(大于2400万行,20列)的特定TSV(制表符分隔)文件时遇到问题。我通常的同伴,read.table,让我失望了。我目前正在通过以下步骤尝试软件包ff: > df <- read.delim.ffdf(file = "data.tsv", + header = TRUE, +

我正在一台64位Windows Server 2008机器上工作,该机器带有Intel Xeon处理器和24 GB RAM。我在尝试读取11GB(大于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"))
如果我没有弄错的话,R抱怨读取数据的内存不足,但是
read…ffdf
过程不应该避免读取数据时大量使用内存吗?我在这里做错了什么?

(我意识到这是一个老问题,但我也遇到了同样的问题,花了两天时间寻找解决方案。这似乎是一个很好的地方,可以为后代记录我最终的发现。)

问题不在于可用内存不足。问题是您已经达到了单个字符串的内存限制。从帮助(“内存限制”):

对单个对象也有限制。存储空间不能超过地址限制,如果试图超过该限制,则错误消息开始时无法分配长度向量字符串中的字节数限制为2^31-1~2*10^9,这也是对数组每个维度的限制

在我的情况下(看起来也是你的情况),我没有费心设置引号字符,因为我处理的是以制表符分隔的数据,我认为这无关紧要。然而,在数据集中的某个地方,我有一个字符串与一个不匹配的报价,然后Read。表愉快地跑过去的结束线,然后到下一个,下一个,和下一个…直到它达到绳子大小的极限并爆炸

解决方案是在参数列表中显式设置
quote=“”

(我意识到这是一个老问题,但我也遇到了同样的问题,花了两天时间寻找解决方案。这似乎是一个很好的地方,可以为后代记录我最终的发现。)

问题不在于可用内存不足。问题是您已经达到了单个字符串的内存限制。从帮助(“内存限制”):

对单个对象也有限制。存储空间不能超过地址限制,如果试图超过该限制,则错误消息开始时无法分配长度向量字符串中的字节数限制为2^31-1~2*10^9,这也是对数组每个维度的限制

在我的情况下(看起来也是你的情况),我没有费心设置引号字符,因为我处理的是以制表符分隔的数据,我认为这无关紧要。然而,在数据集中的某个地方,我有一个字符串与一个不匹配的报价,然后Read。表愉快地跑过去的结束线,然后到下一个,下一个,和下一个…直到它达到绳子大小的极限并爆炸


解决方案是在参数列表中显式设置
quote=“

请参阅此线程中可能有帮助的一些答案:。特别是使用
data.table
包和
sqldf
包中的
fread
。我知道你的问题不是时间效率,但是也许这些方法中的一个也会避免内存问题。而且,如果你在更多代码的中间读取这个数据,这可能有助于确定你的内存使用在哪里:@棉花。不幸的是,
fread
从未使用过我使用的数据帧,因为它们总是包含一个字符列,其中充满了嵌入的引号(函数帮助页本身也承认了这个问题)。至于链接直接指向的
sqldf
备选方案,我似乎无法让它工作,因为它显然在寻找逗号或分号作为分隔符,而我的文件使用制表符。请参阅此线程中的一些答案,可能会有所帮助:。特别是使用
data.table
包和
sqldf
包中的
fread
。我知道你的问题不是时间效率,但是也许这些方法中的一个也会避免内存问题。而且,如果你在更多代码的中间读取这个数据,这可能有助于确定你的内存使用在哪里:@棉花。不幸的是,
fread
从未使用过我使用的数据帧,因为它们总是包含一个字符列,其中充满了嵌入的引号(函数帮助页本身也承认了这个问题)。至于链接直接指向的
sqldf
备选方案,我似乎无法让它工作,因为它显然在寻找逗号或分号作为分隔符,而我的文件使用制表符。
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'