Python数据科学中的内存管理

Python因其易学性、强大的在线学习社区以及丰富的数据操作库(如Pandas、NumPy和Matplotlib)而成为数据科学、数据分析和机器学习领域中最广泛使用的编程语言。这些库使得处理和操作大量数据变得轻松。Python已经成为数据科学家和分析师的首选语言。

Pandas库的数据存储

Pandas库中的DataFrame数据类型允许存储表格数据。DataFrame能够存储大量表格数据,并且通过行和列索引轻松访问这些数据。可以存储具有数百列(字段)和数千行(记录)的数据。

内存使用与管理

在处理大量数据时,必须注意内存的使用。内存不足是处理大量数据时常见的问题。如果整个RAM空间被消耗,程序可能会崩溃并抛出MemoryError,这有时可能难以处理。在这种情况下,限制内存使用变得重要。减少内存使用不仅可以加快计算速度,还可以节省时间。

查看DataFrame的内存使用

Pandas中的info()方法可以告诉特定DataFrame占用了多少内存。为此,可以在info()方法中将memory_usage参数设置为"deep"。这将给出PandasDataFrame占用的总内存。

然而,info()方法并不提供内存使用的详细描述。它只告诉DataFrame使用的总内存。为了获得更详细的概览,可以使用memory_usage()方法。memory_usage()方法给出了DataFrame中每列占用的总内存。它返回一个Pandas系列,列出了DataFrame中每列占用的空间(以字节为单位)。在memory_usage()方法中将deep参数设置为True,可以给出DataFrame列的总内存使用情况。

减少DataFrame的内存使用

通常,具有对象数据类型的列(例如性别、职业和邮政编码)占用的空间很大,因为它们存储的是字符串,这比整数和浮点数占用的空间要多。具有对象数据类型的列可以显著增加内存使用。

为了解决这个问题,可以将某些对象列的数据类型更改为类别类型。例如,性别列只能取两个值,M或F。因此,将性别列的数据类型从对象更改为类别是有意义的。这将导致性别列占用的空间减少。

当性别列的数据类型更改为类别时,性别记录被存储为整数代码而不是字符串。这些整数代码反过来引用字符串值,M或F。由于整数占用的空间比字符串少,内存使用显著减少。DataFrame在表面上可能看起来相同,但其内部存储数据的方式已经改变。性别列占用的空间从58,466字节减少到1,147字节,减少了98%。

类似地,可以更改DataFrame中其他对象列的数据类型。这可以在很大程度上减少内存使用,并可以防止程序中不必要的MemoryError发生。

另一种减少存储仅数值的列使用的内存的方法是根据值的范围更改数据类型。例如,在数据中,年龄的最小值和最大值分别是7和73。这个值的范围完全可以由8位二进制数表示。因此,不是将年龄数据存储为Pandas大多数新版本中的默认64位整数,而是可以将其存储为8位整数。由于存储数据所需的位数减少,内存使用也减少了。

当年龄列的数据类型从int64转换为int8时,该列占用的空间从7544字节减少到943字节,减少了87.5%。还可以将数据类型从int64更改为int16或int32。虽然int16支持的范围是-32,768到+32,767,int32支持的范围要大得多,从-2147483648到+2147483647。可以根据值的范围选择int8、int16或int32。

下表列出了不同整数数据类型可以表示的值的范围:

数据类型 最大值 最小值
int8 127 -128
int16 32767 -32768
int32 2147483647 -2147483648
int64 9223372036854775807 -9223372036854775808

同样,也可以更改存储浮点数的列的数据类型。从float64更改为float16将显著减少空间。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485