内存外NumPy数组
项目描述
Wendelin.core 允许您处理比RAM和本地磁盘更大的数组。大数组持久化到存储中,并且可以以事务方式更改。
换句话说,大数组类似于numpy.memmap,但支持事务和大于磁盘的文件。整个大数组通常不能用作NumPy数组的直接替代,但大数组的 切片 是真正的ndarray,可以在任何可以使用ndarray的地方使用,包括C/Cython/Fortran代码。切片大小受虚拟地址空间大小的限制,在Linux/amd64上最大约为127TB。
用于处理的主要类是 ZBigArray,用法类似于NumPy 中的 ndarray
创建数组
from wendelin.bigarray.array_zodb import ZBigArray import transaction # root is connected to opened database root['A'] = A = ZBigArray(shape=..., dtype=...) transaction.commit()
将数组视为真实的ndarray视图
a = A[:] # view which covers all array, if it fits into address-space b = A[10:100]
视图数据将在内存访问时按需加载。
处理视图,包括使用NumPy和其他库中的C/Cython/Fortran函数读取/修改数据
a[2] = 1 a[10:20] = numpy.arange(10) numpy.mean(a)
一次事务中的修改量应小于可用的RAM。读取的数据量仅受虚拟地址空间大小的限制。可以在O(δ)时间内将数据追加到数组中
values # ndarray to append of shape (δ,) A.append(values)
并且数组本身可以在O(1)时间内调整大小
A.resize(newshape)
数组数据的更改可以是丢弃或保存回数据库
transaction.abort() # discard all made changes transaction.commit() # atomically save all changes
当使用NEO或ZEO作为数据库时,大数组可以由集群中的多个节点同时使用。
请参阅demo/demo_zbigarray.py以获取完整示例。
当前状态和路线图
Wendelin.core在实际工作中适用于Nexedi在生产中使用的负载,包括24/7项目。然而,我们意识到以下限制和需要改进的事项:
wendelin.core目前速度不够快
第三方库(如NumPy、scikit-learn等)中有大型的临时数组分配(大小与输入成正比),这可能会根据使用的功能实际上阻止处理非核心数组。
因此
我们目前正在改进wendelin.core的设计和实现,它将使用内核虚拟内存管理器(而不是在用户空间中实现的一个实现),通过FUSE作为在Go中实现的虚拟文件系统向内核展示数组后端。
同时我们也将
在大型数据集上尝试wendelin.core 1.0
识别并逐步修复NumPy和scikit-learn中的大临时分配问题
我们欢迎社区对此提供帮助。
附加材料
Wendelin.core变更历史
0.13 (2019-06-18)
0.12 (2018-04-16)
更新许可以符合整个Nexedi堆栈(提交)。请参阅https://www.nexedi.com/licensing以获取详细信息、原因和选项。
添加 ArrayRef 工具以找到 NumPy 数组的顶层根父级以及如何将其作为根的某些视图重新创建数组;这为例如在 CMFActivity joblib 后端中发送不进行复制的数组作为引用奠定了基础(提交 1,2,3)。
如果之前 storeblk() 导致了错误,则不会在写入时崩溃(提交)。
修复 py.bench 并重新设计它以产生 Go 基准测试格式的输出(提交 1,2,3,4,5);添加处理页面错误的基准测试(提交)。
如果可用,则使用 zodbtools/zodburi 通过 URL 打开数据库(提交)。
各种错误修复。
0.11 (2017-03-28)
默认切换回使用 ZBlk0 格式(提交)。
0.10 (2017-03-16)
告诉全世界 dtype=object 不受支持(提交)。
0.9 (2017-01-17)
0.8 (2016-09-28)
在加载 ZBlk1 格式的数据时,避免内存泄漏(提交)。
0.7 (2016-07-14)
0.6 (2016-06-13)
0.5 (2015-10-02)
0.4 (2015-08-19)
0.3 (2015-06-12)
添加了对自动BigArray -> ndarray转换的支持,因此例如以下
A = BigArray(...) numpy.mean(A) # passing BigArray to plain NumPy function
要么成功,要么如果可用地址空间不足以覆盖整个A,则引发MemoryError。(当前限制为linux/amd64上的~ 127TB)
(提交)
各种错误修复(构建修复、崩溃、溢出等)
0.2 (2015-05-25)
添加对O(1)就地BigArray.resize()的支持(提交)
各种构建错误修复(旧系统、非标准Python等)
0.1 (2015-04-03)
初始发布
项目详细信息
wendelin.core-0.13.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b9a42b9006272fe128fb37dfe464a4ff643a502f169f5c62f93740ca73720c7c |
|
MD5 | 363d9231212c2fb70ba24b3df850a979 |
|
BLAKE2b-256 | 9f1619c7e649aa33353fc89cc3018f57e50730bbbbb8fb1c6b90f1e549655000 |