Трюки, чтобы управлять доступной памятью в сеансе R

Проблема, с которой вы столкнулись, называется катастрофическим обратным следом и обусловлена ​​большим количеством способов, которыми регулярное выражение может соответствовать началу строки, что дает медленную производительность из-за регулярного выражения обратного отслеживания engine в .NET.

Я думаю, вы слишком часто используете * в своем регулярном выражении. * не означает «конкатенация» - это означает «0 или более раз». Например, здесь не должно быть *:

((?[a-zA-Z]):\\)*

Должна быть не более одной спецификации привода. Здесь вы должны использовать ?, иначе квантификатор, если вы хотите, чтобы спецификация диска была обязательной. Аналогично, в вашем регулярном выражении есть другие места, где квантификатор неверен.

474
задан user227710 10 July 2015 в 12:52
поделиться

6 ответов

Чтобы еще больше проиллюстрировать общую стратегию частых перезапусков, мы можем использовать littler , который позволяет нам запускать простые выражения непосредственно из командной строки. Вот пример, который я иногда использую для измерения времени разных BLAS для простого кросспрода.

 r -e'N<-3*10^3; M<-matrix(rnorm(N*N),ncol=N); print(system.time(crossprod(M)))'

Аналогичным образом

 r -lMatrix -e'example(spMatrix)'

загружает пакет Matrix (с помощью переключателя --packages | -l) и запускает примеры функции spMatrix. Поскольку r всегда запускается «заново», этот метод также является хорошим тестом во время разработки пакета.

И последнее, но не менее важное, r также отлично работает в автоматическом пакетном режиме в сценариях с использованием '#! / Usr / bin / r' shebang- заголовок. Rscript - альтернатива там, где малый недоступен (например, в Windows).

25
ответ дан 22 November 2019 в 22:47
поделиться

Я использую пакет data.table . С его оператором := вы можете:

  • Добавить столбцы по ссылке
  • Изменить подмножества существующих столбцов по ссылке и по группе по ссылке
  • Удалить столбцы по ссылка

Ни одна из этих операций не копирует (потенциально большой) data.table, даже один раз.

  • Агрегирование также особенно быстро, потому что data.table использует гораздо меньше рабочей памяти.

Ссылки по теме:

154
ответ дан Community 10 July 2015 в 12:52
поделиться

Убедитесь, что вы записываете свою работу в воспроизводимом сценарии. Время от времени повторно открывайте R, затем source () ваш скрипт. Вы очистите все, что больше не используете, и в качестве дополнительного преимущества протестируете свой код.

187
ответ дан 22 November 2019 в 22:47
поделиться

I never save an R workspace. I use import scripts and data scripts and output any especially large data objects that I don't want to recreate often to files. This way I always start with a fresh workspace and don't need to clean out large objects. That is a very nice function though.

30
ответ дан 22 November 2019 в 22:47
поделиться

Это хороший трюк.

Еще одно предложение - по возможности использовать объекты с эффективным использованием памяти: например, использовать матрицу вместо data.frame.

На самом деле это не относится к управлению памятью, а к одной важной функции, которая широко не известна это memory.limit (). Вы можете увеличить значение по умолчанию, используя эту команду, memory.limit (size = 2500), где размер указан в МБ. Как упоминал Дирк, вам необходимо использовать 64-разрядную версию, чтобы воспользоваться этим преимуществом.

33
ответ дан 22 November 2019 в 22:47
поделиться

Мне нравится сценарий Дирка .ls.objects (), но я продолжал щуриться, чтобы подсчитать символы в столбце размера. Итак, я сделал несколько уродливых приемов, чтобы представить его с красивым форматированием для размера:

.ls.objects <- function (pos = 1, pattern, order.by,
                        decreasing=FALSE, head=FALSE, n=5) {
    napply <- function(names, fn) sapply(names, function(x)
                                         fn(get(x, pos = pos)))
    names <- ls(pos = pos, pattern = pattern)
    obj.class <- napply(names, function(x) as.character(class(x))[1])
    obj.mode <- napply(names, mode)
    obj.type <- ifelse(is.na(obj.class), obj.mode, obj.class)
    obj.size <- napply(names, object.size)
    obj.prettysize <- sapply(obj.size, function(r) prettyNum(r, big.mark = ",") )
    obj.dim <- t(napply(names, function(x)
                        as.numeric(dim(x))[1:2]))
    vec <- is.na(obj.dim)[, 1] & (obj.type != "function")
    obj.dim[vec, 1] <- napply(names, length)[vec]
    out <- data.frame(obj.type, obj.size,obj.prettysize, obj.dim)
    names(out) <- c("Type", "Size", "PrettySize", "Rows", "Columns")
    if (!missing(order.by))
        out <- out[order(out[[order.by]], decreasing=decreasing), ]
        out <- out[c("Type", "PrettySize", "Rows", "Columns")]
        names(out) <- c("Type", "Size", "Rows", "Columns")
    if (head)
        out <- head(out, n)
    out
}
48
ответ дан 22 November 2019 в 22:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: