NumPy memmap在第一次只读时从大文件缓慢加载小块

时间:2018-12-23 06:52:01

标签: python numpy numpy-memmap

我正在使用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具有相当合理的结果,除了这个随机问题。

0 个答案:

没有答案