memshare enables multicore computation in R without redundant memory copies. Large vectors, matrices, or lists are stored once in shared memory and exposed to R processes as ALTREP views. This allows workers in a PSOCK cluster to operate on the same physical data while avoiding serialization overhead.
Key features:
shm_open on Unix, MapViewOfFile on Windows).parallel::parApply and parallel::parLapply:memApply() — apply a function row/column-wise over a matrix in shared memory.memLapply() — apply a function element-wise over a list in shared memory.From CRAN:
install.packages("memshare")
From GitHub (development version):
remotes::install_github("mthrun/memshare")
System requirements: R ≥ 4.0 and a C++17 compiler.
library(memshare)
library(parallel)
set.seed(1)
n = 10000
p = 2000
X = matrix(rnorm(n * p), n, p)
y = rnorm(n)
res = memApply(
X = X, MARGIN = 2,
FUN = function(v, y) cor(v, y),
VARS = list(y = y)
)
str(res)
library(memshare)
library(parallel)
list_length = 1000
matrix_dim = 100
ListV = lapply(
1:list_length,
function(i) matrix(rnorm(matrix_dim * matrix_dim),
nrow = matrix_dim, ncol = matrix_dim))
y = rnorm(matrix_dim)
namespace = "ID123"
res = memshare::memLapply(ListV, function(el, y) {
el %*% y
}, NAMESPACE=namespace, VARS=list(y=y), MAX.CORES = 1)
Each element el of ListV is multiplied by y in parallel. The list resides once in shared memory.
Pages: memory regions owned by the current R session that loaded the package.
Views: ALTREP wrappers exposing shared memory variables (read/write capable).
Namespaces: string identifiers defining a shared memory context across sessions.
When the package is detached, all handles and associated shared memory pages are released, unless another R process still holds references.
memshare exposes explicit lifecycle functions so you can control when data is
placed in shared memory and when it is freed.
registerVariables(namespace, variableList)Allocate shared memory and copy R objects (matrices or vectors, or lists for memLapply) into it.
- namespace: character(1). Identifier of the shared memory context shared across processes.
- variableList: a named list of objects to register. Names become the keys under which
you can later retrieve views.
Example
library(memshare)
ns <- "my_namespace"
X <- matrix(rnorm(1e4), 100, 100)
y <- rnorm(100)
registerVariables(ns, list(X = X, y = y))
# Now X and y live once in shared memory and can be accessed from other R processes
releaseVariables(namespace, variableNames)Delete variables from the shared memory space. Shared regions are only removed when no active views remain.
- namespace: character(1) used above.
- variableNames: character vector of variable names to free.
Example
# After all workers have released their views:
releaseVariables(ns, c("X", "y"))
retrieveViews() and releaseViews()To avoid duplication, workers attach to shared memory by views:
- retrieveViews(namespace, c("X","y")) returns ALTREP-backed objects that behave like ordinary R matrices/vectors.
- Always call releaseViews(namespace, ...) when finished so that the backing memory can be reclaimed.
Example (worker-side)
vlist <- retrieveViews(ns, c("X","y"))
# use vlist$X and vlist$y
releaseViews(ns, c("X","y"))
Tip:
memApply()andmemLapply()manage views for you automatically, but the low-level API above is useful for custom workflows.
The full manual for users or developers is available here: Package documentation
[Thrun and Märte, 2025] Thrun, M.C., Märte, J.: Memshare: Memory Sharing for Multicore Computation in R with an Application to Feature Selection by Mutual Information using PDE, 2025.
[Thrun et al., 2020] Thrun, M.C., Gehlert, T., & Ultsch, A.: Analyzing the Fine Structure of Distributions, PLOS ONE, 15(10), e0238835, 2020.
[Ultsch, 2005] Ultsch, A.: Pareto Density Estimation: A Density Estimation for Knowledge Discovery, Proceedings of the 28th Annual Conference of the German Classification Society, Springer, 2005
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.