Data.table: Поддержка формата файла .gz для fread

Созданный на 4 июл. 2014  ·  52Комментарии  ·  Источник: Rdatatable/data.table

У меня есть несколько тысяч файлов .gz содержащих данные в формате csv - всего около 60 ГБ в пересчете на файлы .gz . Распаковка их и загрузка некоторых частей через fread оказывается огромной проблемой на первом этапе. Мне интересно, можно ли улучшить функциональность fread чтобы он мог читать сжатые форматы файлов так же, как read.table ?

Возможно, проблемы с подключением файлов очень важны, как упоминалось в № 341, № 543 и № 561.
Другая ссылка:

http://stackoverflow.com/questions/5764499/decompress-gz-file-using-r

http://blog.revolutionanalytics.com/2009/12/r-tip-save-time-and-space-by-compressing-data-files.html

High feature request fread

Самый полезный комментарий

Просто положите сюда мой совет для пользователей OS X.
Синтаксис zcat в OS X немного отличается от других систем Linux. Для чтения файлов *.gz используйте следующий вызов:

dt <- fread(input = 'zcat < data.gz')

Все 52 Комментарий

Вы можете просто выполнить fread('zcat file.gz') или какой-нибудь вариант цикла, если у вас много файлов.

: Bump: весьма полезно (и заходит часто).

Вот один пост SO .

Да, это было бы очень полезной функцией. Использование командной строки - это в лучшем случае временное решение, поскольку оно полагается на базовую систему, имеющую инструменты для распаковки. Например, zcat недоступен в Windows, если не установлен cygwin и т. Д.

Поскольку FRead на сегодняшний день является лучшим инструментом в R для чтения файлов, прямое чтение файлов gzip / bziped / ... привело бы к огромному увеличению производительности.

Я только что увидел в письме отметку @arun , и буквально несколько часов назад я проглотил более 200 таких файлов. +1 за полезность

Было бы полезно и здесь:
http://www.magesblog.com/2014/10/visualising-seasonality-of-atlantic.html
Взглянем.

Я согласен с @gbonamy, чтение напрямую из zip-файлов было бы фантастическим дополнением !!

Чтение из соединения с unz () также было бы весьма полезно. У меня есть функция, которая загружает zip-файл и читает только один файл, а затем выбрасывает его. Так что, если бы я мог использовать fread (unz (zipfile, file = file)), это было бы отличным дополнением.

Я ++ про прямо из gz файлов. Я бы лично использовал его каждый день.

+1 от меня тоже.

+1

+1

+1

+1

+1

Мне любопытно - люди, которые просят это, в основном работают в Windows? Я не вижу желания заниматься такой специализацией в Linux.

Я лично в основном использую сжатие .xz, но мне было бы все равно, если бы fread напрямую поддерживал его - я очень часто передаю несжатый результат и выполняю некоторую постобработку перед его загрузкой в ​​R (например, fread('xzcat file.xz | grep smth | awk blah') ), и мне нравится не зависеть от возможностей чтения файлового формата fread - мои процессы оболочки почти всегда будут более продвинутыми, чем то, что реализовано в fread .

: +1:

Просто положите сюда мой совет для пользователей OS X.
Синтаксис zcat в OS X немного отличается от других систем Linux. Для чтения файлов *.gz используйте следующий вызов:

dt <- fread(input = 'zcat < data.gz')

Это, вероятно, не самый эффективный способ, но он работает для меня, вам, вероятно, придется заменить unz на gzfile :

zread <- function(zf,f,...){
  require(data.table)
  res <- fread(paste(readLines(tmp <- unz(zf,f)), collapse = "\n"),...)
  close(tmp)
  res
}

readLines невероятно медленно ...

@dselivanov он выполняет свою работу с небольшими файлами, но никогда не пробовал его с большими, хотя ... мой метод, вероятно, выполняет много бесполезного распределения памяти, передавая весь файл как вектор символов.

Просто закройте файл, см. Предыдущие сообщения

Во вторник, 8 декабря 2015 г., gdkrmr [email protected] написал:

@dselivanov https://github.com/dselivanov он выполняет свою работу на небольших
файлы ... мой метод, вероятно, делает много бесполезного распределения памяти, передавая
весь файл как вектор символов.

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/Rdatatable/data.table/issues/717#issuecomment -162838134
.

+1 для нас, незадачливых пользователей Windows и за переносимость. Могут быть причины, по которым fread не может принять соединение (как в help("connections", package="base") ), но в противном случае это было бы отличным и переносимым решением. Также помогло бы с некоторыми распространенными проблемами кодирования (например, спецификациями в файлах UTF-8).

+1 Наш производственный сервер - Linux, но мы кодируем и тестируем на машинах с Windows. Наличие этой функциональности, встроенной в fread, позволило бы нам создать одну версию кода, работающую в обеих средах.

+1

+1

zcat | не подходит для очень больших файлов данных по следующим причинам:
gzip: stdout: No space left on device

@webbp, если у вас нет необычного монтирования / dev / shm - если вы не можете zcat его в / dev / shm (что fread делает внутри), тогда я не понимаю, насколько нативно поддержка вам поможет. Возможно, вам просто не хватает оперативной памяти.

+1

@eantonya да, мне не хватает барана; у меня своп только 32g + 64g. zcat file.tsv.gz> file.tsv с последующим fread ('file.tsv') - достаточно простой обходной путь, но я и другие ( 1 2 3 ) были бы благодарны за правильное решение.

@webbp Вам следует изменить размер / dev / shm (также известного как ваша виртуальная память), чтобы он был больше, чем ваша физическая оперативная память, и у вас не будет этой проблемы. Ваш (несжатый) файл больше, чем 1/2 размера вашей RAM (но меньше, чем ваша RAM, иначе fread несжатого файла не сработает), и у вас есть значение shm по умолчанию, равное половине вашей RAM , или вы увеличили объем оперативной памяти после установки и не обновили / etc / fstab.

+1

+1

+1 - также для других подключений ( gzfile , bzfile , xzfile , unz )

+1 Мое первое желание от fread / fwrite

@webbp , у меня такая же пбм. Я не могу использовать zcat, хотя это красиво, потому что в моем экземпляре AWS EC2 слишком маленький размер в / dev / shm. Я должен попытаться перенаправить / dev / shm на диск EBS, но пока не понял, как это сделать. Между тем, «zcat file.tsv.gz> file.tsv, за которым следует fread ('file.tsv')» - временный обходной путь, но, по крайней мере, он работает.

Альтернативной идеей было бы использовать конкретный каталог tmp. Любая идея?

+1

+1

+1

Можно ли сделать так, чтобы в пакете R были инструменты командной строки для windows, mac, liunx, завернутые в один и тот же интерфейс. Затем мы можем использовать использование zcat с fread, когда этот пакет установлен.

Пример такого пакета

Я понял, что такой пакет не будет разрешен в CRAN, если вам нужно упаковать версию gzip для Windows в package. Либо разместите его в другом месте, либо попросите пользователя загрузить окна gzip самостоятельно.

Распаковать файл во временный файл на диске всегда будет работать, но это может быть медленным из-за доступа к диску. Если мы прочитаем файл в необработанный вектор в ОЗУ, а затем распакуем его с помощью memDecompress перед подачей несжатого необработанного вектора в fread, это сработает?

Я написал функцию, которая распаковывает zip, gz, bzip2, xz во временный файл, запускает функцию и удаляет временный файл . Итак, мы можем использовать temp_unzip(file, fread, ...) .

Код представляет собой чистый R, поэтому он должен работать на всех платформах. Я считаю, что метод zcat достаточно хорош для linux / mac (иногда мне нужно указывать имя файла), но слишком сложен для Windows.

Код вдохновлен R.utils но мне действительно не нравится его поведение по умолчанию, когда по умолчанию удаляется входной файл. Также я думаю, что автор R.utils только что изменил код compressFile чтобы использовать его для decompressFile . Для сжатия необходимо вызывать gzfile и bzfile отдельности, но не нужно вызывать gzfile , bzfile и xzfile отдельно, потому что gzfile может обрабатывать все форматы сжатия (кроме zip, который я использовал unzip ).

Вот несколько тестов:

library(microbenchmark)
microbenchmark(
  fread(eg_csv),
  fread(input = paste0("zcat < '", eg_gz, "'")), 
  temp_unzip(eg_bz, fread),
  temp_unzip(eg_zip, fread),
  temp_unzip(eg_gz, fread),
  times = 1)
Unit: seconds
                                          expr      min       lq     mean   median       uq
                                 fread(eg_csv) 2.117812 2.117812 2.117812 2.117812 2.117812
 fread(input = paste0("zcat < '", eg_gz, "'")) 1.984009 1.984009 1.984009 1.984009 1.984009
                      temp_unzip(eg_bz, fread) 6.304849 6.304849 6.304849 6.304849 6.304849
                     temp_unzip(eg_zip, fread) 2.481650 2.481650 2.481650 2.481650 2.481650
                      temp_unzip(eg_gz, fread) 2.487811 2.487811 2.487811 2.487811 2.487811
      max neval
 2.117812     1
 1.984009     1
 6.304849     1
 2.481650     1
 2.487811     1

Следует отметить, что решение zcat работает только в том случае, если файл существует в том же каталоге, в котором запущен R:

Error in fread("zcat < data/directory/test.csv.gz") :
  File is empty: /var/folders/41/asdf_kj80000gn/T//RtmpwtAttt/fileebeb5e124cef

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

Спустя 3 года все еще жду этого элементарного исправления.

После дальнейшего исследования моя ошибка выше возникает только тогда, когда в имени каталога есть пробелы:

fread("zcat < data/directory\ one/test.csv.gz"

Но не с подчеркиванием:

fread("zcat < data/directory_two/test.csv.gz"

И можно смягчить, снова сняв обратную косую черту:

fread("zcat < data/directory\\ one/test.csv.gz"

Надеюсь это поможет. В противном случае решение zcat работает нормально.

Еще один пример на StackOverflow, зачем нужна эта функция:
data.table fread error - gzip file - установить временный каталог

Как насчет:

library(readr)
DT = as.data.table(read_csv("myfile.gz"))

Это значительно медленнее.

-------- Исходное сообщение --------
От: Уэбб Филлипс
Дата: 2018/03/01 18:26 (GMT + 00: 00)
Кому: "Rdatatable / data.table"
Копия: Михаил Спиваков, Комментарий
Тема: Re: [Rdatatable / data.table] Поддержка формата файла .gz для fread (# 717)

Как насчет:

dt = as.data.table (read_csv ("myfile.gz")) ``

-
Вы получили это, потому что прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub https://github.com/Rdatatable/data.table/issues/717#issuecomment-369684424 или отключите поток https://github.com/notifications/unsubscribe-auth/ ABlQ65ZJPuwpxCfmJTuRZ1aBPh4Jejniks5taD06gaJpZM4CKNWu .
Институт Бабраама, Исследовательский городок Бабрахама, Кембридж. Зарегистрированная благотворительная организация CB22 3AT № 1053902.
Информация, переданная в этом электронном письме, адресована только адресату. Если вы получили это сообщение по ошибке, свяжитесь с отправителем и удалите это письмо из вашей системы. Содержание этого электронного письма является мнением отправителя и не обязательно отражает точку зрения Института Бабраама. Полные условия на: www.babraham.ac.uk http://www.babraham.ac.uk/terms

setDT будет быстрее, чем as.data.table. Какой инструмент использует read_csv для
разблокировать .gz?

2 марта 2018 г. в 2:32 "mspivakov" [email protected] написал:

Это значительно медленнее.

-------- Исходное сообщение --------
От: Уэбб Филлипс
Дата: 2018/03/01 18:26 (GMT + 00: 00)
Кому: "Rdatatable / data.table"
Копия: Михаил Спиваков, Комментарий
Тема: Re: [Rdatatable / data.table] Поддержка формата файла .gz для fread
(# 717)

Как насчет:

dt = as.data.table (read_csv ("myfile.gz")) ``

-
Вы получили это, потому что прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub Rdatatable / data.table / issues / 717 # issuecomment-369684424> или отключите звук
нить ABlQ65ZJPuwpxCfmJTuRZ1aBPh4Jejniks5taD06gaJpZM4CKNWu>.
Институт Бабраама, Исследовательский кампус Бабраама, Кембридж CB22 3AT
Зарегистрированная благотворительная организация № 1053902.
Информация, переданная в этом электронном письме, предназначена только для
адресат. Если вы получили это по ошибке, свяжитесь с отправителем и
удалите это письмо из вашей системы. Содержание этого электронного письма является
взгляды отправителя и не обязательно отражают точку зрения
Институт Бабрахама. Полные условия на: www.babraham.ac.uk babraham.ac.uk/terms>

-
Вы получаете это, потому что подписаны на эту беседу.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/Rdatatable/data.table/issues/717#issuecomment-369686247 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AHQQdZa08PZo9LKMGbnzMnmUeaspKxgVks5taD6wgaJpZM4CKNWu
.

@frenchja - согласен - хотя вы могли бы предпочесть избежать этих пробелов с помощью shQuote R.

readr читает данные из соединения (? Gzfile) в памяти: https://github.com/tidyverse/readr/blob/6f0bb65296afa55709fd60cdc5d59a4c89623e36/src/connection.cpp

И он анализируется с помощью read_tokens_ : https://github.com/tidyverse/readr/blob/6f0bb65296afa55709fd60cdc5d59a4c89623e36/src/read.cpp

@frenchja Как это будет работать с past0 ? Теперь у меня есть код ниже, но это вызывает ошибку:

SOME_DIR = "/Users/swvanderlaan/some_dir"
data <- fread('zcat < paste0(SOME_DIR,"/somedata.txt.gz")', 
                                                          header = TRUE, na.strings = "NA", 
                                                          verbose = TRUE, showProgress = TRUE)

А, понял, должно быть так:

data <- 
  fread(paste0("zcat < '", SOME_DIR,"/somedata.txt.gz","'"), 
                                                          header = TRUE, na.strings = "NA", 
                                                          verbose = TRUE, showProgress = TRUE)

@swvanderlaan Я обычно использую sprintf для подобных случаев; вам также следует использовать file.path и shQuote чтобы обеспечить надежность платформы:

fread(sprintf('zcat %s', shQuote(file.path(SOME_DIR, 'somedata.txt.gz'))))
Была ли эта страница полезной?
0 / 5 - 0 рейтинги