跳转到主要内容

内存外NumPy数组

项目描述

Wendelin.core 允许您处理比RAM和本地磁盘更大的数组。大数组持久化到存储中,并且可以以事务方式更改。

换句话说,大数组类似于numpy.memmap,但支持事务和大于磁盘的文件。整个大数组通常不能用作NumPy数组的直接替代,但大数组的 切片 是真正的ndarray,可以在任何可以使用ndarray的地方使用,包括C/Cython/Fortran代码。切片大小受虚拟地址空间大小的限制,在Linux/amd64上最大约为127TB。

用于处理的主要类是 ZBigArray,用法类似于NumPy 中的 ndarray

  1. 创建数组

    from wendelin.bigarray.array_zodb import ZBigArray
    import transaction
    
    # root is connected to opened database
    root['A'] = A = ZBigArray(shape=..., dtype=...)
    transaction.commit()
  2. 将数组视为真实的ndarray视图

    a = A[:]        # view which covers all array, if it fits into address-space
    b = A[10:100]

    视图数据将在内存访问时按需加载。

  3. 处理视图,包括使用NumPy和其他库中的C/Cython/Fortran函数读取/修改数据

    a[2] = 1
    a[10:20] = numpy.arange(10)
    numpy.mean(a)
    一次事务中的修改量应小于可用的RAM。
    读取的数据量仅受虚拟地址空间大小的限制。
  4. 可以在O(δ)时间内将数据追加到数组中

    values                  # ndarray to append of shape  (δ,)
    A.append(values)

    并且数组本身可以在O(1)时间内调整大小

    A.resize(newshape)
  5. 数组数据的更改可以是丢弃或保存回数据库

    transaction.abort()     # discard all made changes
    transaction.commit()    # atomically save all changes

当使用NEOZEO作为数据库时,大数组可以由集群中的多个节点同时使用。

请参阅demo/demo_zbigarray.py以获取完整示例。

当前状态和路线图

Wendelin.core在实际工作中适用于Nexedi在生产中使用的负载,包括24/7项目。然而,我们意识到以下限制和需要改进的事项:

  • wendelin.core目前速度不够快

  • 第三方库(如NumPyscikit-learn等)中有大型的临时数组分配(大小与输入成正比),这可能会根据使用的功能实际上阻止处理非核心数组。

因此

  • 我们目前正在改进wendelin.core的设计和实现,它将使用内核虚拟内存管理器(而不是在用户空间中实现的一个实现),通过FUSE作为在Go中实现的虚拟文件系统向内核展示数组后端。

同时我们也将

  • 在大型数据集上尝试wendelin.core 1.0

  • 识别并逐步修复NumPy和scikit-learn中的大临时分配问题

我们欢迎社区对此提供帮助。

附加材料

  • Wendelin.core教程

  • 幻灯片pdf)来自2015年PyData巴黎会议关于wendelin.core的演讲


Wendelin.core变更历史

0.13 (2019-06-18)

0.12 (2018-04-16)

  • 更新许可以符合整个Nexedi堆栈(提交)。请参阅https://www.nexedi.com/licensing以获取详细信息、原因和选项。

  • 添加 ArrayRef 工具以找到 NumPy 数组的顶层根父级以及如何将其作为根的某些视图重新创建数组;这为例如在 CMFActivity joblib 后端中发送不进行复制的数组作为引用奠定了基础(提交 123)。

  • loadblk() 期间,如果在棘手的时间运行了两次垃圾回收,则不会崩溃(提交 12)。

  • 如果之前 storeblk() 导致了错误,则不会在写入时崩溃(提交)。

  • 修复 py.bench 并重新设计它以产生 Go 基准测试格式的输出(提交 12345);添加处理页面错误的基准测试(提交)。

  • 如果可用,则使用 zodbtools/zodburi 通过 URL 打开数据库(提交)。

  • 开始确保它也适用于 ZODB5(提交 12)。

  • 各种错误修复。

0.11 (2017-03-28)

  • 默认切换回使用 ZBlk0 格式(提交)。

0.10 (2017-03-16)

  • 告诉全世界 dtype=object 不受支持(提交)。

0.9 (2017-01-17)

  • 通过在释放 virtmem 锁的情况下进行 storeblk() 调用来避免死锁(提交 12)。

  • 如果 loadblk() 实现中内部引发并捕获异常,则不会崩溃(提交 123)。

0.8 (2016-09-28)

  • 在加载 ZBlk1 格式的数据时,避免内存泄漏(提交)。

0.7 (2016-07-14)

  • 添加对 Python 3.5 的支持(提交 12)。

  • 修复可能导致崩溃和其他问题的 pagemap 代码中的错误(提交)。

  • 各种错误修复

0.6 (2016-06-13)

  • 添加对 FORTRAN 排序的支持(提交 12)。

  • 通过在释放 virtmem 锁的情况下进行 loadblk() 调用来避免死锁(提交 12)。

  • 各种错误修复

0.5 (2015-10-02)

  • 引入另一种存储格式,该格式针对小更改进行了优化,并将其设置为默认格式(提交 12)。

  • 各种错误修复和文档改进

0.4 (2015-08-19)

  • BigArray.append() 中添加对 O(δ) 原地支持(提交)。

  • 实现适当的线程支持(提交)。

  • 当后端的 ZODB 对象从外部更改时,实现正确的 RAM 页面失效(提交 12)。

  • 修复在处理请求过程中ZODB连接更改工作线程时可能发生的所有故障(提交12

  • 现在Tox测试涵盖了与FileStorage、ZEO和NEO ZODB存储的使用(提交12

  • 各种错误修复

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 (3.1 MB 查看哈希值

上传时间

由以下机构支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误记录StatusPageStatusPage状态页面