猿问

为什么相同数据的 str 数组和 object 数组的内存使用量不同?

我有一个大的文本数据集及其相应的标签。我曾经使用csv模块读取 csv 文件,然后numpy在该数据上构建数组,直到我发现 numpy 中的大型文本数组内存效率低下。


with open('sample.csv', 'r') as f: 

    data = csv.reader(f.readlines())                                                                                                                                             


texts = np.array([d[0] for d in data])

这需要大约 13GB 内存。但是当pandas读取相同的数据时,就像什么都没发生一样,内存中没有数据存在。我的意思是它不是减少 50% 甚至 20% 的内存使用量,它只需要 300 MB 的内存。


data = pd.read_csv('sample.csv')


texts2 = np.array(data['text'])

texts和数组之间的唯一区别texts2是dtype:


texts.dtype

dtype('<U92569')


texts2.dtype

dtype('O')


MYYA
浏览 97回答 1
1回答

繁星淼淼

您的第一个数组使用 NumPy 字符串 dtype。这些是固定宽度的,因此数组的每个元素占用的空间与数组中最长的字符串一样多,其中一个字符串的长度为 92569 个字符,从而提高了较短字符串的空间需求。您的第二个数组正在使用 object dtype。它只包含对一堆常规 Python 对象的引用,因此每个元素都是一个常规 Python 字符串对象。每个元素都有额外的对象开销,但每个字符串只需要足够的空间来保存自己的数据,而不是足够的空间来保存数组中最大的字符串。此外,NumPy unicode dtypes 总是每个字符使用 4 个字节,而如果字符串不包含任何高代码点,则 Python 字符串对象使用较少。
随时随地看视频慕课网APP

相关分类

Python
我要回答