跳转到主要内容

compressio

项目描述

Compressio Logo

Compressio

Compressio提供由visions类型系统支持的pandas DataFrames和Series的无损内存压缩。使用相同的数据,可节省高达10倍的内存!

入门非常简单:

from compressio import Compress

compress = Compress()
compressed_data = compress.it(data)

框架

Compressio是一个通用的自动化数据压缩和表示管理框架,不仅限于任何特定的压缩算法或实现。您拥有完全的控制权,可以定义自己的类型,编写自己的压缩算法,或者从visions提供的庞大类型库和Compressio默认包含的强大算法套件开始。

这些算法可以根据以下三个基本的优化策略进一步细分

  1. 尽可能选择信息无损的小数据类型
  2. 考虑(更高效的)数据表示
  3. 使用更高效的数据结构压缩数据

* 这是visions之外事情变得复杂的地方

1. 更小的数据类型

在内部,pandas 使用 NumPy 数组来存储数据。每个 NumPy 数组都有一个相关的 dtype,用于指定数据的物理、磁盘上的表示形式。例如,一个整数序列可能存储为 64 位整数(int64)、8 位无符号整数(uint8)或甚至 32 位浮点数(float32)。可以在 此处 找到 NumPy 类型系统的概述。

这些类型差异具有许多计算影响,例如,8 位整数可以表示 0 到 255 之间的数字,而 64 位整数的范围在 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 之间,但代价是内存占用增加 8 倍。不同大小也可能对计算性能产生影响。

import numpy as np

array_int_64 = np.ones((1000, 1000), dtype=np.int64)
print(array_int_64.nbytes)
8000000

array_int_8 = np.ones((1000, 1000), dtype=np.int8)
print(array_int_8.nbytes)
1000000

正如您所看到的,8 位整数数组将内存使用量减少了 87.5%。

2. 适当的机器表示

Compressio 使用 visions 来推断数据的语义类型,并将其强制转换为替代计算表示形式,以最小化内存影响同时保持其语义意义。

例如,虽然 pandas 可以使用通用的对象 dtype 存储布尔序列,但这会付出 4 倍内存占用的代价。Visions 可以自动处理这些情况以找到适合您数据的相关表示。

>>>> import pandas as pd
>>>> # dtype: object
>>>> series = pd.Series([True, False, None, None, None, None, True, False] * 1000)
>>>> print(series.nbytes)
64000

>>>> # dtype: boolean (pandas' nullable boolean)
>>>> new_series = series.astype("boolean")
>>>> print(new_series.nbytes)
16000

有关更多信息,请参阅 visions 文档github 仓库JOSS 出版物

3. 高效的数据结构

如果没有额外的指令,pandas 将您的数据表示为 密集型 数组。这是一个全面的良好选择。

当您的数据不是随机分布时,它可以被压缩(理论)。

低基数数据通常可以使用 pandas 默认提供的 稀疏数据结构 存储得更加高效,这些结构通过只存储主要值一次并保留所有其他值的索引来提供效率。

这个笔记本 展示了如何使用 compressio 与稀疏数据结构一起使用。

数据结构优化不仅限于稀疏数组,还包括许多特定领域的机遇,例如可以应用于压缩顺序数据的 运行长度编码(RLE)。我们注意到,目前正在进行 pandas 特定的第三方实现:RLEArray

使用方法

安装

您可以使用 pip 轻松安装 compressio

pip install compressio

或者,从源代码安装。

git clone https://github.com/dylan-profiler/compressio.git

示例

Code example.

示例目录 中有一系列示例笔记本可以用来玩耍,以及一个快速入门笔记本可供 在此 使用。

优化 pandas 中的字符串

Pandas 允许以多种方式存储字符串:作为字符串对象或作为 pandas.Category。pandas 的最新版本有一个 pandas.String 类型。

您在 pandas 中如何存储字符串可以显著影响所需的 RAM。

Memory usage of string representations in pandas

此分析的关键见解是

  • 当值重复时,Category 比 String 表示形式更节省内存;String 表示形式的百分比是不同值的数量。
  • Series 的大小对于字符串表示形式的选择 不是 决定性的。

您可以在 此处 找到完整分析。

注意事项

压缩 DataFrame 在许多情况下可能很有帮助,但并非所有情况都适用。请注意以下情况下的应用方式

  • 溢出:通过降低精度进行压缩可能导致后续对数组进行操作时发生溢出。例如,对于 numpy 整数,这可能会成为一个问题。如果这对您的应用程序造成问题,您可以选择显式选择精度。

  • 兼容性:其他库可能对如何处理压缩数据有不同的决策。一个需要调整代码以匹配压缩数据的例子是,当将稀疏数据结构与 .groupby 结合使用时。(observed 必须设置为 True)。这篇文章 提供了另一个例子,scikit-image的一些函数会立即将给定的数组转换为 float64 数据类型。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

compressio-0.1.4.tar.gz (1.3 MB 查看哈希值)

上传时间

构建分布

compressio-0.1.4-py3-none-any.whl (11.0 kB 查看哈希值)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面