Skip to content

Commit 3d9fb23

Browse files
committed
Allow seurat merge in batches to reduce memory footprint
1 parent bffca63 commit 3d9fb23

File tree

1 file changed

+40
-16
lines changed

1 file changed

+40
-16
lines changed
Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,49 @@
1-
if (length(seuratObjects) == 1) {
2-
print('There is only one seurat object, no need to merge')
3-
datasetId <- names(seuratObjects)[[1]]
4-
saveData(seuratObjects[[datasetId]], datasetId)
5-
} else {
1+
doDiet <- exists('doDiet') && doDiet
2+
3+
mergeBatch <- function(dat) {
64
toMerge <- list()
7-
for (datasetId in names(seuratObjects)) {
8-
doDiet <- exists('doDiet') && doDiet
9-
if (exists('doDiet') && doDiet) {
10-
print('Running DietSeurat on inputs')
11-
toMerge[[datasetId]] <- Seurat::DietSeurat(readRDS(seuratObjects[[datasetId]]))
5+
for (datasetId in names(dat)) {
6+
message(paste0('Loading: ', datasetId))
7+
if (doDiet) {
8+
toMerge[[datasetId]] <- Seurat::DietSeurat(readRDS(dat[[datasetId]]))
129
gc()
1310
} else {
14-
toMerge[[datasetId]] <- readRDS(seuratObjects[[datasetId]])
11+
toMerge[[datasetId]] <- readRDS(dat[[datasetId]])
1512
}
1613
}
1714

1815
seuratObj <- CellMembrane::MergeSeuratObjs(toMerge, projectName = projectName, doGC = doDiet, errorOnBarcodeSuffix = errorOnBarcodeSuffix)
19-
rm(toMerge)
20-
saveData(seuratObj, projectName)
16+
return(seuratObj)
2117
}
2218

23-
# Cleanup
24-
rm(seuratObjects)
25-
gc()
19+
if (length(seuratObjects) == 1) {
20+
print('There is only one seurat object, no need to merge')
21+
datasetId <- names(seuratObjects)[[1]]
22+
saveData(seuratObjects[[datasetId]], datasetId)
23+
} else {
24+
batchSize <- 20
25+
numBatches <- ceiling(length(seuratObjects) / batchSize)
26+
mergedObjects <- list()
27+
for (i in 1:numBatches) {
28+
message(paste0('Merging batch ', i, ' of ', numBatches))
29+
start <- 1 + (i-1)*batchSize
30+
end <- min(start+batchSize-1, length(seuratObjects))
31+
message(paste0('processing: ', start, ' to ', end, ' of ', length(seuratObjects)))
32+
33+
mergedObjects[[i]] <- mergeBatch(seuratObjects[start:end])
34+
gc()
35+
}
36+
37+
message('Done with batches')
38+
if (length(mergedObjects) == 1) {
39+
seuratObj <- mergedObjects[[1]]
40+
} else {
41+
message('performing final merge')
42+
seuratObj <- merge(x = mergedObjects[[1]], y = mergedObjects[2:length(mergedObjects)], project = mergedObjects[[1]]@project.name)
43+
}
44+
45+
rm(mergedObjects)
46+
gc()
47+
48+
saveData(seuratObj, projectName)
49+
}

0 commit comments

Comments
 (0)