Ускорение преобразования 2 миллионов строк строк даты в POSIX.ct
У меня есть csv, который содержит около 2 миллионов строк строк даты в формате:
2012/11/13 21:10:00
Позволяет называть csv$Date.and.Time
Я хочу как можно быстрее преобразовать эти даты (и их сопровождающие данные) в xts
Я написал script, который выполняет преобразование просто отлично (см. ниже), но он ужасно медленный, и я хотел бы ускорить это как можно больше.
Вот моя нынешняя методология. У кого-нибудь есть предложения по тому, как сделать это быстрее?
dt <- as.POSIXct(csv$Date.and.Time,tz="UTC")
idx <- format(dt,tz=z,usetz=TRUE)
Итак, script преобразует эти строки даты в POSIX.ct
. Затем выполняется преобразование часового пояса с использованием format
(z
- переменная, представляющая TZ, к которой я конвертирую). Затем я делаю регулярный вызов xts
, чтобы сделать это серией xts с остальными данными в csv.
Это работает 100%. Это просто очень, очень медленно. Я пытался запустить это параллельно (он ничего не делает, если что-то еще хуже). Что я подразумеваю под "медленным"?
user system elapsed
155.246 16.430 171.650
Что на 3GhZ, 16GB ram 2012 mb pro. Я могу получить примерно половину, что на аналогичном процессоре с 32 ГБ оперативной памяти на машине Win7
Я уверен, что у кого-то есть лучшая идея - я открыт для предложений через Rcpp
и т.д. Однако в идеале решение работает с csv, а не с каким-либо другим методом, например с настройкой базы данных. Сказав это, я сделаю это с помощью любого способа, который даст самое быстрое преобразование.
Я бы очень признателен за любую помощь. Спасибо заранее.
Ответы
Ответ 1
Вам нужен небольшой и простой fasttime пакет Simon, который делает это самым быстрым способом --- не вызывая функции разбора времени, а просто используя C -строчные строковые функции.
Он не поддерживает столько форматов, сколько strptime
. Фактически, в нем нет даже строки формата. Но хорошо сформированные варианты формата ISO, то есть yyyy-mm-dd hh:mm:ss.fff
, будут работать, и ваш разделитель /
может просто работать.
Ответ 2
Попробуйте использовать lubridate
- он выполняет все время синтаксического анализа времени с использованием регулярных выражений, поэтому он не только намного быстрее, но и намного более гибкий.