read_delim литеральных данных после модификаций огромного вектора символов

У меня есть несколько файлов с разделителями, несколько очень больших (много ГБ), которые имеют недостатки. Кто-то по ошибке пропустил одно поле и разделитель, но только в некоторых строках.

Я хотел бы прочитать каждый файл как вектор строк символов, используя read_lines, а затем применить count.fields (есть ли версия этого tidyverse?), чтобы разделить строки на два вектора строк по количеству токенов. (Я должен удалить последнюю строку в одном из векторов). После всех этих манипуляций я хочу дважды использовать read_delim для разбора наборов строк с разным количеством разделителей. Как я могу обмануть read_delim, чтобы прочитать каждый вектор строк без каких-либо изменений? Или мое единственное решение - написать новые временные файлы, а затем использовать read_delim?

Онлайн-справка для read_delim говорит: «файл» может быть литералом, но «он должен содержать хотя бы одну новую строку, чтобы распознаваться как данные (вместо пути)».

«вставить» может добавлять новые строки (как показано ниже), но зачем мне это делать, чтобы обмануть read_delim и заставить его читать буквальные данные вместо пути? Почему бы не добавить параметр к read_delim, чтобы он считывал литеральные данные в виде вектора строк?

Я хочу передать вектор строки targetSet, но read_delim нужна новая строка:

 d <- read_delim(paste(targetSet, collapse="\n"), delim="|",
                  col_types=cols(.default="c"))

Это работает с файлами, содержащими 100 000 записей, но вставка не выполняется с одним файлом, содержащим около 160 миллионов записей:

Ошибка при вставке (targetSet, свернуть = "\n"): результат превысит 2 ^ 31-1 байт

Я использую 64-битную R, поэтому я не понимаю это сообщение. У меня должны быть десятки ГБ памяти на компьютере с Linux, который я использую.

Есть ли способ заставить read_delim читать модифицированный вектор строк из read_lines? Есть ли аккуратная версия textConnection?


person Earl F Glynn    schedule 11.04.2018    source источник


Ответы (1)


Взглянув на исходный код paste в paste.c, мы находим две строки

if (pwidth > INT_MAX)
error(_("результат превысит 2^31-1 байт"));

Таким образом, paste проверяет, равна ли длина вставленной строки символов <= INT_MAX, и возвращает указанную выше ошибку, если это не так.

R имеет LONG_INT_MAX и INT_MAX, последний из которых является 32-битным целым числом, поэтому может иметь максимальное значение 2^31 - 1 (один бит для знака), что соответствует примерно 2,1 миллиарда.

Кажется, что paste(targetSet, collapse = "\n") превышает этот лимит символов.

person Maurits Evers    schedule 11.04.2018