问题标签 [numpy-memmap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 为什么 numpy.memmap 初始化这么快?
numpy.memmap用零初始化(在具有 POSIX 文件系统语义的系统上)。
那么如何只需要 0.3 秒就可以像这样用零填充一个 10 GB 的文件:
将 10 GB 写入磁盘通常需要 0.3 秒以上。
python - numpy.unpackbits 的懒惰版本
我numpy.memmap
过去只将数组的一部分加载到我需要的内存中,而不是加载整个巨大的数组。我想对bool
数组做同样的事情。
不幸的是,bool
memmap 数组的存储并不经济:根据ls
, memmap 文件需要与相同数组形状bool
的 memmap 文件一样多的空间。uint8
所以我用它numpy.unpackbits
来节省空间。不幸的是,它似乎并不懒惰:它很慢并且可能导致 a MemoryError
,因此显然它将数组从磁盘加载到内存中,而不是在数组上提供“bool
视图” uint8
。
因此,如果我只想bool
从文件中加载数组的某些条目,我首先必须计算uint8
它们属于哪些条目,然后应用于该条目numpy.unpackbits
,然后再次对其进行索引。
难道没有一种懒惰的方式来获得bool
对位压缩的 memmap 文件的“视图”吗?
python - 限制现有 memmap 的维度 (NumPy)
我有一个 .dat 文件,其中包含使用 numpy.memmap 生成的大型 (600000,6,8000) 浮点数组。
第三个轴代表一个日期范围。在运行时,用户指定更窄的日期范围。结果是我最终array[i, :, user_start:user_end]
在执行过程中沿第三维进行了数百万次切片。
我知道可以将 memmap 偏移一个固定数字,但是有没有办法在运行开始时限制数组的维度,这样我就不需要每次都对第三个轴进行切片?
python - 是否可以在不刷新其内容的情况下关闭 memmap 的临时文件?
用例:巨大的图像处理。当中间数据集超过物理内存时,我使用内存映射临时文件。完成后,我无需将中间结果存储到磁盘。当我删除它们时,numpy 似乎首先将它们的所有内容刷新到磁盘,然后从文件系统中删除文件。刷新对 I/O 资源和文件系统征税,据我了解,鉴于文件随后被删除,这在逻辑上是不必要的。
是否可以在不刷新其内容的情况下关闭 memmap 的临时文件?
python-3.x - Python:对象的memmap列表在joblib并行中变为“无”类型
我正在执行以下操作:
- 我有张量流 DNN 层的列表。
nn.append(tf.layers.dense(...))
- 上面的每个列表都附加到 np.memmap 对象列表中。
nnList[i] = nn
- 我可以访问 memmap 列表并检索张量。但是当尝试访问其中的张量时,
joblib.parallel
它会返回“无”类型的对象。但是,内部的 memmap 列表的长度是正确的joblib.parallel
。
我在下面附上了一个示例代码。
上面的代码给出了这个输出。请注意数组的长度以及张量如何变为None
.
我怎样才能访问里面的张量joblib.parallel
?请帮忙。
numpy - numpy memmap 运行时错误.... 2Gigas 限制的 64 位系统?
我正在尝试使用 numpy memmap 创建一个大文件
该系统是在 64 位 python 中运行的 Windows 10-64 位
有足够的虚拟内存(最大120000Megas)
但是,每次我尝试创建一个结果大小应超过 2Gigas 的文件时,都会出现运行时错误
当文件大小低于 2Gigas 时,不会发生此错误...
我已经用另一个同样是 64 位的 Windows 7 复制了同样的问题
我忘记了什么吗?为什么 memmap 充当我的 32 位系统?
编辑:该错误不完全是运行时错误。变量“bytes”在尝试获取文件的长度时收到运行时警告,导致我猜测一个错误的参数会引发 Errno 22
python - 为什么 concurrent.futures 在返回 np.memmap 时会占用内存?
问题
我的应用程序正在提取内存中的 zip 文件列表并将数据写入临时文件。然后我将临时文件中的数据进行内存映射,以便在另一个函数中使用。当我在单个进程中执行此操作时,它工作正常,读取数据不会影响内存,最大 RAM 约为 40MB。但是,当我使用 concurrent.futures 执行此操作时,RAM 会增加到 500MB。
我看过这个例子,我知道我可以在处理过程中以更好的方式提交作业以节省内存。但我不认为我的问题是相关的,因为我在处理过程中没有耗尽内存。我不明白的问题是为什么即使在返回内存映射后它仍然保留内存。我也不了解内存中的内容,因为在单个进程中执行此操作不会将数据加载到内存中。
谁能解释内存中的实际内容以及为什么单处理和并行处理之间存在差异?
PS我用来memory_profiler
测量内存使用情况
代码
主要代码:
其他功能:
数据的帮助代码
我无法分享我的实际数据,但这里有一些简单的代码来创建演示问题的文件:
python - NumPy memmap 在第一次只读时从大文件中缓慢加载小块
我正在使用 NumPy memmap 从整个大型二进制文件的各个位置加载少量数据(memmap'd、重塑、翻转,然后从大约 2 GB 的二进制文件加载大约 2000x1000 个点)。有五个 2 GB 文件,每个文件都有自己的内存映射对象。
内存映射的创建速度非常快。前几个文件中的数据片段很快就会被提取出来。但是,然后,它突然停在第四和第五档。内存使用率仍然很低,因此,它似乎没有将整个文件读入内存,但是来自进程的 I/O 访问很高。这可能需要十到十五分钟才能清除,然后一切都按预期进行。随后对所有内存映射的访问非常迅速,包括加载以前未触及的数据。内存使用率始终很低。关闭 Python 并重新运行,直到重新启动后问题才会再次出现(可能是缓存?)。
我在使用 Python 2.7 的 Windows 10 上。对故障排除有任何想法吗?
编辑:评论中有文件格式类型和示例代码的请求。不幸的是,我无法提供确切的细节;但是,我可以说这么多。文件格式仅包含 3D 数组的 int16 二进制值,可以通过格式 [n1, n2, n3] 重新整形,其中 n* 是每个维度的长度。但是,这些文件被拆分为 2GB。所以,它们是这样加载的:
这当然不是世界上最干净的代码,但它通常可以工作,除了这个看似随机的减速。用户有一个滑块,允许他们从这个数组中绘制一个切片作为
我遗漏了很多细节,但我认为这捕获了最相关的信息。
编辑 2:另外,我对处理这个问题的替代方法持开放态度。我的最终目标是将任意且相对较小的 2D 数据块实时交互式绘制为来自大型 3D 数据集的图像,该数据集可能被拆分为多个二进制文件。我目前正在使用 pyqtgraph,结果相当合理,除了这个随机问题。
python - 在 joblib 中缓存数据框
Joblib 具有通过自动映射数组来跨进程共享 Numpy 数组的功能。然而,这利用了 Numpy 特定的设施。Pandas 确实在后台使用 Numpy,但除非您的列都具有相同的数据类型,否则您无法真正将 DataFrame 序列化为单个 Numpy 数组。
缓存 DataFrame 以在 Joblib 中重用的“正确”方法是什么?
我最好的猜测是分别对每一列进行内存映射,然后在循环内重建数据框(并祈祷 Pandas 不会复制数据)。但这似乎是一个相当密集的过程。
我知道独立的 Memory 类,但尚不清楚这是否有帮助。
python - 在python中,GC如何处理mmap?
我正在用python编写一个多处理系统。其中一个子进程负责使用 cv2 从相机流中读取帧,并将该帧传递给另一个子进程以进行一些操作和预览。问题是为了将消息从一个进程传递到另一个进程,我使用“pickle”模块来序列化消息对象。时间在这里至关重要,所以我使用 numpy.memmap,而不是为每个会被序列化的帧使用 numpy 数组。我想了解的是 python 如何处理 memmap 创建的内存。一旦流读取器对象不再保留对 memmap 对象的引用(在它被腌制和发送之后)会发生什么。框架可以从内存中释放吗?如果不是,那么我是否面临内存问题?python如何知道框架何时不再使用并删除它?
一些示例代码:
运行此代码不会显示任何内存问题。我仍然想了解为什么。