Подтвердить что ты не робот

Ускорение преобразования 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, а не с каким-либо другим методом, например с настройкой базы данных. Сказав это, я сделаю это с помощью любого способа, который даст самое быстрое преобразование.

Я бы очень признателен за любую помощь. Спасибо заранее.

4b9b3361

Ответ 1

Вам нужен небольшой и простой fasttime пакет Simon, который делает это самым быстрым способом --- не вызывая функции разбора времени, а просто используя C -строчные строковые функции.

Он не поддерживает столько форматов, сколько strptime. Фактически, в нем нет даже строки формата. Но хорошо сформированные варианты формата ISO, то есть yyyy-mm-dd hh:mm:ss.fff, будут работать, и ваш разделитель / может просто работать.

Ответ 2

Попробуйте использовать lubridate - он выполняет все время синтаксического анализа времени с использованием регулярных выражений, поэтому он не только намного быстрее, но и намного более гибкий.