Проблема, с которой вы столкнулись, называется катастрофическим обратным следом и обусловлена большим количеством способов, которыми регулярное выражение может соответствовать началу строки, что дает медленную производительность из-за регулярного выражения обратного отслеживания engine в .NET.
Я думаю, вы слишком часто используете *
в своем регулярном выражении. *
не означает «конкатенация» - это означает «0 или более раз». Например, здесь не должно быть *
:
((?[a-zA-Z]):\\)*
Должна быть не более одной спецификации привода. Здесь вы должны использовать ?
, иначе квантификатор, если вы хотите, чтобы спецификация диска была обязательной. Аналогично, в вашем регулярном выражении есть другие места, где квантификатор неверен.
Чтобы еще больше проиллюстрировать общую стратегию частых перезапусков, мы можем использовать 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).
Я использую пакет data.table . С его оператором :=
вы можете:
Ни одна из этих операций не копирует (потенциально большой) data.table
, даже один раз.
data.table
использует гораздо меньше рабочей памяти. Ссылки по теме:
Убедитесь, что вы записываете свою работу в воспроизводимом сценарии. Время от времени повторно открывайте R, затем source ()
ваш скрипт. Вы очистите все, что больше не используете, и в качестве дополнительного преимущества протестируете свой код.
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.
Это хороший трюк.
Еще одно предложение - по возможности использовать объекты с эффективным использованием памяти: например, использовать матрицу вместо data.frame.
На самом деле это не относится к управлению памятью, а к одной важной функции, которая широко не известна это memory.limit (). Вы можете увеличить значение по умолчанию, используя эту команду, memory.limit (size = 2500), где размер указан в МБ. Как упоминал Дирк, вам необходимо использовать 64-разрядную версию, чтобы воспользоваться этим преимуществом.
Мне нравится сценарий Дирка .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
}