R не удалось выделить память в процедуре ff. Как так?

Я работаю на 64-битной машине Windows Server 2008 с процессором Intel Xeon и 24 ГБ оперативной памяти. У меня возникли проблемы с чтением определенного файла TSV (с разделителями табуляцией) размером 11 ГБ (> 24 миллиона строк, 20 столбцов). Мой обычный компаньон, 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"))

Что отлично работает примерно для 6 миллионов записей, но затем я получаю сообщение об ошибке, как вы можете видеть:

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'

Если я не ошибаюсь, R жалуется на нехватку памяти для чтения данных, но разве процедура read...ffdf не должна была обойти интенсивное использование памяти при чтении данных? Что я могу делать неправильно здесь?


person Waldir Leoncio    schedule 08.08.2014    source источник
comment
Посмотрите некоторые ответы в этой теме, которые могут быть вам полезны: stackoverflow.com/a/1820610/3897439. Особенно при использовании fread из пакета data.table и пакета sqldf. Я знаю, что ваша проблема не в экономии времени, но, возможно, один из этих методов также позволит избежать проблемы с памятью.   -  person Cotton.Rockwood    schedule 09.08.2014
comment
Кроме того, если вы читаете эти данные в середине кода, это может помочь определить, где используется ваша память: stackoverflow.com/q /1358003/3897439   -  person Cotton.Rockwood    schedule 09.08.2014
comment
@Cotton.Rockwood: Спасибо за помощь. К сожалению, fread никогда не работал с фреймами данных, с которыми работаю я, поскольку они всегда включают один символьный столбец, полный встроенных кавычек (сама страница справки по функции признает проблему). Что касается альтернативы sqldf, на которую ваша ссылка указывает напрямую, я не могу заставить ее работать, потому что, по-видимому, она ищет запятую или точку с запятой в качестве разделителя, а в моем файле используются табуляции.   -  person Waldir Leoncio    schedule 11.08.2014


Ответы (1)


(Я понимаю, что это старый вопрос, но у меня была та же проблема, и я провел два дня в поисках решения. Это кажется таким же хорошим местом, как и любое другое, чтобы задокументировать то, что я в конечном итоге понял для потомков.)

Проблема не в том, что у вас заканчивается доступная память. Проблема в том, что вы достигли предела памяти для одной строки. Из справки('Ограничения памяти'):

Существуют также ограничения на отдельные объекты. Место для хранения не может превышать лимит адресов, и если вы попытаетесь превысить этот лимит, появится сообщение об ошибке: не удается выделить вектор длины. Количество байтов в строке символов ограничено 2^31 - 1 ~ 2*10^9, что также является ограничением для каждого измерения массива.

В моем случае (и, похоже, в вашем тоже) я не удосужился установить символ кавычки, так как имел дело с данными, разделенными табуляцией, и я предположил, что это не имеет значения. Однако где-то в середине набора данных у меня была строка с непревзойденной кавычкой, а затем read.table благополучно пробежала до конца строки и перешла к следующей, и следующей, и следующей... до тех пор, пока он достиг предела размера строки и взорвался.

Решение состояло в том, чтобы явно установить quote = "" в списке аргументов.

person Drew    schedule 16.03.2017