Самый быстрый способ прочитать несколько огромных TXT-файлов OVER L OOP в r - PullRequest
0 голосов
/ 15 января 2020

Эта топика c ( Быстрое чтение очень больших таблиц в виде фреймов данных ) исследует ту же проблему, но не более l oop. У меня есть 1000 различных файлов .txt каждый 200 МБ с 1 миллионом строк. Какой самый быстрый способ прочитать их после l oop?

Я практиковал следующие способы с указанным расчетным временем для случая 10 файлов.

for (i in 1:10){
x<- read.delim()
# do something
}
# Time : 89 sec

for (i in 1:10){
x<- read.table()
# do something
}
# Time : 90 sec 

for (i in 1:10){
x <- fread()
# do something
}
# Time : 108  sec . !!!! (to my knowledge it is supposed to be the fastest, but when it comes to loop it is not the fastest though)!

foreach (i in 1:10)%dopar{
x<- read.delim()
# do something
}

# Time: 83 sec

foreach(i in 1:10) %dopar{
x <- fread()
# do something
}

# Time: 95 sec

Мне сказали, что пакет disk.frame () самый быстрый. Не могу пока попробовать. Нужны ваши мысли, пожалуйста. Можно ли применять Laapply для ускорения процесса?

Ответы [ 2 ]

0 голосов
/ 15 января 2020

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

Быстрая работа с «большими данными»

200 ГБ текстовых файлов - это достаточно большие данные, которые потребует значительных усилий для ускорения обработки или значительного времени ожидания. Нет простого пути назад;)

  1. вам нужно получить данные в память, чтобы начать любую работу
    • это быстрее всего читать ваши файлы один за другим (НЕ параллельно) при чтении с одного жесткого диска
    • измерьте, сколько времени потребуется для загрузки данных без разбора
    • ваше время загрузки для нескольких похожих файлов будет кратно времени одного файла, вы здесь не может быть никаких улучшений c
    • , чтобы улучшить время загрузки, которое вы можете сжимать входными файлами - это окупается, только если вы будете использовать один и тот же источник данных несколько раз (после сжатия меньше байты должны пересекать жесткий диск -> граница памяти, что медленно)
    • при выборе способа сжатия данных вы стремитесь к тому, чтобы нагрузка (сжатая) + время распаковки была меньше, чем нагрузка (распакованная)
  2. вам необходимо проанализировать необработанные данные
    • измерить, сколько времени потребуется для анализа данных
    • , если вы не можете разделить анализ, измерьте, сколько т То есть, для загрузки и анализа данных требуется, чтобы время анализа было разницей с ранее измеренным временем загрузки
    • Разбор может быть распараллелен, но это имеет смысл, только если это существенная часть времени загрузки
  3. вам нужно сделать свое дело
    • обычно это можно сделать параллельно
  4. вам нужно сохранить результаты
    • если результаты не настолько велики, как входные данные, вам все равно
    • если они огромны, вам нужно снова сериализовать свой IO, то есть сохранять его один за другим, а не параллельно
    • снова помогает сжатие, если вы выбираете алгоритм и настройки, где время сжатия + время записи меньше, чем время записи несжатых данных

Для получения необработанного время загрузки, bash ваш друг. Используя pipe viewer или встроенный time, вы можете легко проверить время, необходимое для чтения файла, выполнив

pv mydata.txt > /dev/null

# alternatively
time cat mydata.txt > /dev/null

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

Что касается сжатия, если вы застряли с R, gzip является единственным разумным вариантом. Если вы сделаете некоторую предварительную обработку в bash, то lz4 - инструмент выбора, потому что он действительно быстр при приличном сжатии. ios.

gzip -3 mydata.txt
pv mydata.txt.gz | zcat > /dev/null

Здесь мы подходим к предварительная обработка. Стоит использовать UNIX инструменты, которые, как правило, очень быстро обрабатывают данные перед загрузкой в ​​R. Вы можете фильтровать столбцы с cut, фильтровать строки с mawk (что часто намного быстрее, чем gawk).

0 голосов
/ 15 января 2020

Может быть, lapply () может помочь, как вы предложили

myFiles <- list.files(pattern="txt$")
myList <- lapply(myFiles, function(x) fread(x))

Я также удивлен, что для вас fread занимает больше времени, чем read.table. Когда у меня были большие файлы, fread действительно помогал читать их быстрее.

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