R - Рекурсивное объединение CSV-файлов для больших наборов данных при добавлении файловой структуры. - PullRequest
1 голос
/ 25 января 2020

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

Я работаю с относительно большими наборами данных , что до сих пор были обработаны через мой код. После того, как я прочитал все мои файлы, я собираю их от широких до длинных, а затем объединяю две таблицы и создаю пару выходных данных. Объединенный вывод до моего последнего увеличения данных составлял ~ 80 миллионов строк.

Мой самый новый набор данных приводит к двум таблицам, шириной 700 столбцов и длиной 3 миллиона строк. Когда я читаю каждый файл, я добавляю два столбца данных во внешний интерфейс, чтобы определить местоположение файла в структуре моей папки.

Проблема возникает, когда я пытаюсь использовать сбор для перевода каждой таблицы из широкой в ​​длинную , Я получаю сообщение об ошибке, которое в основном говорит о том, что таблица слишком велика, и 192 ГБ памяти не собирается ее обрезать.

Error in melt_dataframe(data, id_idx - 1L, gather_idx - 1L, as.character(key_var),  : 
  negative length vectors are not allowed

Однако в каждой таблице МНОГО мертвого пространства, заполненного значениями NA. Проблема в том, что я не могу свернуть таблицу из-за столбцов пути к файлу.

Формат CSV:

sequence  place  sample1  sample2 sample3
abcdhjj     a       500    99       1000
hffdjf      b       400    1000     66

и т. Д. С количеством строк до 200k на CSV, и обычно менее 60 образцов столбцов. Объединенные DF создаются из ~ 40 файлов и ~ 700 сэмплов.

Когда я читаю в файлах, используя

filelist=list.files(path="/sample_dir/",recursive=T,pattern=".csv",full.names=T)

mylist = tibble(file = filelist) %>%
  mutate(Data = lapply(file, read_csv)) %>%
  unnest(Data)

, я разделяю путь к файлу и отбрасываю ненужные столбцы, в результате:

folder1   folder2  sequence  place  sample1  sample2 sample3 sampleA  sampleB  SampleC
A1         B2       abcdhjj     a       500    99       1000    NA      NA       NA
A1         B2        hffdjf      b       400    1000     66     NA      NA       NA
A2         B1       abcdhjj     a        NA      NA       NA    500    99       1000 
A2         B1        hffdjf      b       NA      NA       NA    400    1000     66 

et c, причем каждый из 36 файлов содержит новый блок выборок, который создает значения NA для каждого другого блока. (Однако список последовательностей не одинаков для каждого файла.) Вероятно, было бы лучше проигнорировать файловую структуру и выполнить какое-либо объединение при чтении каждого CSV-файла, чтобы минимизировать количество значений NA и уменьшить общее количество строк. , Но я застрял, понимая, что я должен делать.

Конечный желаемый результат - длинная таблица:

folder1  folder2 sample sequence place value
(~100 million rows+ long)

Оттуда я бы слил соответствующие строки значений из второй таблицы и создайте свой окончательный вывод, как я делал до того, как возникла проблема с памятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...