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

Попытка создать дату из строки в Racket - find-seconds ОЧЕНЬ медленная, требуется рабочий день недели?

Я пытаюсь разобрать даты из большого файла csv в Racket.

Самый простой способ сделать это - создать новую структуру date. Но для этого требуются параметры week-day и year-day. Конечно, у меня их нет, и это кажется настоящей слабостью модуля date, который я не понимаю.

Итак, в качестве альтернативы я решил использовать find-seconds для преобразования необработанных дат даты в секунды, а затем передать это на seconds->date. Это работает, но жестоко медленно.

(time
 (let loop ([n 10000])
   (apply find-seconds '(0 0 12 1 1 2012)) ; this takes 3 seconds for 10000
   ;(date 0 0 12 1 1 2012 0 0 #f 0) ; this is instant
   (if (zero? n)
       'done
       (loop (sub1 n)))))

find-seconds занимает 3 секунды, чтобы сделать 10000 значений, и у меня есть несколько миллионов. Создание структуры date, конечно, мгновенно, но у меня нет значений дня, дня и дня.

Мои вопросы:

1.) Почему требуется week-day/year-day для создания структур даты?

2.) Предполагается ли find-seconds быть таким медленным (т.е. ошибка)? Или я делаю что-то неправильно?

3.) Есть ли какие-либо альтернативы для синтаксического анализа даты. Я знаю, что srfi/19 имеет функцию string->date, но мне пришлось бы изменить все, чтобы использовать эту модульную структуру вместо встроенной встроенной утилиты. И он может пострадать так же, как и в секундах find-seconds, я не уверен.

4b9b3361

Ответ 1

Хотя он не документирован как таковой, кажется, что week-day и year-day являются "no-ops" при использовании структуры date с date->seconds. Если я установил их как 0, a date->seconds не жалуется. Я подозреваю, что он игнорирует их:

#lang racket

(require racket/date)

(define d (date 1    ;sc
                2    ;mn
                3    ;hr
                20   ;day
                8    ;month
                2012 ;year
                0    ;weekday  <<<
                0    ;year-day <<<
                #f   ;dst?
                0    ;time-zone-offset
                ))

(displayln (seconds->date (date->seconds d)))

;; =>
#(struct:date* 1 2 3 20 8 2012 1 232 #t -14400 0 EDT)
                               ^ ^^^

Я предполагаю, что структура date была определена для использования с seconds->date, где week-day и year-day будет интересной информацией. Затем для date->seconds вместо определения другой структуры с отсутствующими полями (они "избыточны" для определения даты, поэтому вы понятны раздражены:)) для использования с date->seconds, одна и та же структура была повторно использована.

Помогает ли это? Мне непонятно, из вашего вопроса, что вы пытаетесь сделать с информацией о дате из CSV. Если вы хотите преобразовать его в целое число seconds, я думаю, что вышеприведенное должно работать на вас. Если у вас есть что-то еще, возможно, вы могли бы объяснить.

Ответ 2

Я бы сказал, что это недосмотр в racket/date.

Вызов find-seconds стоит дорого, потому что нужно найти количество секунд. И так как вам нужно только знать, что в будний день это ненужное вычисление.

Напишите в список рассылки, чтобы получить совет.