Как загрузить большой CSV-файл со столбцами смешанного типа, используя пакет bigmemory - PullRequest
6 голосов
/ 07 августа 2011

Есть ли способ объединить использование scan () и read.big.matrix () из пакета bigmemory для чтения в файле 200 МБ .csv со столбцами смешанного типа, так что в результате получается кадр данных с целым числом, символьные и числовые столбцы?

Ответы [ 4 ]

9 голосов
/ 07 августа 2011

Попробуйте пакет ff для этого.

library(ff)
help(read.table.ffdf)

Функция «read.table.ffdf» считывает отдельные плоские файлы в «ffdf» объекты, очень похожие (и использующие) «read.table». Это также может работать с любыми удобными обертками, такими как «read.csv» и предоставляет его собственная удобная обертка (например, «read.csv.ffdf») для обычного R оберток.

Для 200 Мб это должно быть такой же простой задачей, как эта.

 x <- read.csv.ffdf(file=csvfile)

(Для файлов гораздо больших размеров, вероятно, потребуется изучить некоторые параметры конфигурации, в зависимости от вашего компьютера и ОС).

6 голосов
/ 07 августа 2011

Ах, есть некоторые вещи, которые невозможны в этой жизни, и есть такие, которые неправильно поняты и приводят к неприятным ситуациям. @ Роман прав: матрица должна быть одного атомарного типа. Это не датафрейм.

Поскольку матрица должна быть одного типа, попытка снукера bigmemory для обработки нескольких типов сама по себе плохая вещь. Можно ли это сделать? Я не пойду туда. Зачем? Потому что все остальное будет предполагать, что он получает матрицу, а не фрейм данных. Это приведет к большему количеству вопросов и печали.

Теперь, что вы можете сделать, это определить типы каждого из столбцов и сгенерировать набор отдельных файлов большой памяти, каждый из которых содержит элементы определенного типа. Например. charBM = большая матрица символов, intBM = большая целочисленная матрица и т. д. Затем вы можете разработать оболочку, которая создает фрейм данных из всего этого. Тем не менее, я не рекомендую: относиться к различным элементам так, как они есть, или приводить к однородности, если это возможно, вместо того, чтобы пытаться создать большой грифон данных.

@ mdsumner правильно предположил ff. Другой вариант хранения - HDF5, доступ к которому вы можете получить через ncdf4 в R. К сожалению, эти другие пакеты не так приятны, как bigmemory.

3 голосов
/ 07 августа 2011

Согласно справочному файлу, нет.

Файлы должны содержать только один атомарный тип (например, все целые числа). Вы, пользователь, должны знать, есть ли в вашем файле строка и / или столбец имена и различные комбинации параметров должны быть полезны в получение желаемого поведения.

Я не знаком с этим пакетом / функцией, но в R матрицы могут иметь только один атомарный тип (в отличие, например, от data.frames).

0 голосов
/ 23 марта 2013

Лучшее решение - читать файл построчно и анализировать его, таким образом, процесс чтения будет занимать объем памяти почти линейно.

...