Вы обнаружили ошибку (проблема здесь ) - data.table
пытается определить, является ли вывод []
ключевым; для этого выполняется внутренняя функция is.sorted
. Это очень медленно для огромной таблицы уникальных строк.
К счастью, мы можем провести статический c анализ и понять, что ваша выходная таблица фактически снабжена ключами - подмножества нет, а ключевой столбец (V1
) без изменений. Следовательно, порядок сортировки не может быть изменен, и ваш вывод также будет отсортирован по V1
.
Этот лог c встроен в PR, чтобы исправить эту проблему - вы можете протестировать его с помощью remotes::install_github('Rdatatable/data.table@fix_sorting_on_sorted')
, с оговоркой, что это новейшая версия пакета, или вы можете подождать, пока он не будет объединен с мастером, или пока не будет выпущена новая версия для CRAN.
In Между тем, вот обходной путь:
setkey(x, NULL)
system.time(x[ , .(V1)])
# user system elapsed
# 0.120 0.087 0.213
Конечно, это блокирует дальнейшую обработку от распознавания того, что ваши данные отсортированы, и их эффективности ...
В этом случае (! и в этом случае только - используйте осторожно !!!) - если вы уверены, что данные уже отсортированы по V1
- вы можете мгновенно восстановить ключ с помощью:
setattr(x, 'sorted', 'V1')
Подробнее как правило, есть небольшие различия между выбором [
, [[
, $
, и т.д. c. [
будет, как правило, самым медленным, поскольку мы проводим много «статического c анализа запросов», чтобы помочь повысить эффективность вашего кода, что связано с затратами на производительность, которые мы надеемся, будут небольшими. почти каждый раз. Каждый раз, когда эта стоимость не мала, это должно быть ошибкой. Также ведется активная работа, чтобы попытаться предложить ярлыки для уменьшения этих накладных расходов, см., Например, этот PR