我正在使用NumPy内存映射从整个大型二进制文件的各个位置加载少量数据(内存映射,重新整形,翻转,然后从大约2 GB的二进制文件加载大约2000x1000点)。有五个2 GB的文件,每个文件都有自己的内存映射对象。
创建内存映射非常快。从前几个文件中提取的数据非常快。但是,然后它突然停止在第四和第五个文件上。内存使用率仍然很低,因此,似乎没有将整个文件读入内存,但是,来自该进程的I / O访问却很高。清除可能很容易需要十到十五分钟,然后一切都按预期进行。随后通过所有内存映射进行访问的速度非常快,包括加载以前未触及的数据。内存使用率始终保持较低水平。关闭Python并重新运行,直到重新启动(也许正在缓存?)之后,问题才再次出现。
我在使用Python 2.7的Windows 10上。有任何疑难解答的想法吗?
编辑:注释中有一个文件格式类型和示例代码的请求。不幸的是,我无法提供确切的细节。但是,我可以这么说。文件格式仅包含3D数组的int16二进制值,该值可以通过[n1,n2,n3]格式进行整形,其中n *是每个维度的长度。但是,文件分割为2GB。因此,它们的加载方式如下:
library(tidyverse)
func <- function(x) {
a <- sym(paste0("Sepal.", x)) # these need to be quosures to refer to variables
b <- sym(paste0("Petal.", x))
iris %>% transmute(
!!paste0("Compare.", x) := case_when(
!!a > !!b ~ "Sepal", # unquote quosures
!!a < !!b ~ "Petal",
TRUE ~ "Equal"
)
)
}
inputVector <- c("Length", "Width")
iris %>% bind_cols(map_dfc(inputVector, func)) %>% head()
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species Compare.Length
#> 1 5.1 3.5 1.4 0.2 setosa Sepal
#> 2 4.9 3.0 1.4 0.2 setosa Sepal
#> 3 4.7 3.2 1.3 0.2 setosa Sepal
#> 4 4.6 3.1 1.5 0.2 setosa Sepal
#> 5 5.0 3.6 1.4 0.2 setosa Sepal
#> 6 5.4 3.9 1.7 0.4 setosa Sepal
#> Compare.Width
#> 1 Sepal
#> 2 Sepal
#> 3 Sepal
#> 4 Sepal
#> 5 Sepal
#> 6 Sepal
这当然不是世界上最干净的代码,但是它通常可以工作,除了看似随机的减速。用户有一个滑块,可让他们从该数组中绘制切片为
func2 <- function(x) {
columns <- map_dfc(x, function(y){
a <- paste0("Sepal.", y)
b <- paste0("Petal.", y)
column <- list(case_when(
iris[[a]] > iris[[b]] ~ "Sepal", # base notation is simpler than quosures
iris[[a]] < iris[[b]] ~ "Petal",
TRUE ~ "Equal"
))
names(column) <- paste0("Compare.", y)
column
})
iris %>% bind_cols(columns)
}
func2(inputVector) %>% tail()
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 145 6.7 3.3 5.7 2.5 virginica
#> 146 6.7 3.0 5.2 2.3 virginica
#> 147 6.3 2.5 5.0 1.9 virginica
#> 148 6.5 3.0 5.2 2.0 virginica
#> 149 6.2 3.4 5.4 2.3 virginica
#> 150 5.9 3.0 5.1 1.8 virginica
#> Compare.Length Compare.Width
#> 145 Sepal Sepal
#> 146 Sepal Sepal
#> 147 Sepal Sepal
#> 148 Sepal Sepal
#> 149 Sepal Sepal
#> 150 Sepal Sepal
我遗漏了很多细节,但是我认为这捕获了最相关的信息。
编辑2:此外,我愿意接受其他方法来处理此问题。我的最终目标是实时交互绘制任意和相对较小的2D数据块,将其作为来自大型3D数据集的图像,并可以将其拆分为多个二进制文件。我目前使用pyqtgraph具有相当合理的结果,除了这个随机问题。