Meh*_*ban 1 python numpy pandas
我有一个很大的文本数据集及其相应的标签。我曾经使用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])
Run Code Online (Sandbox Code Playgroud)
这需要大约 13GB 的内存。但是当pandas读取完全相同的数据时,就像什么都没发生一样,内存中没有数据。我的意思是,它的内存使用量并没有减少 50% 甚至 20%,它只需要 300 MB 的内存。
data = pd.read_csv('sample.csv')
texts2 = np.array(data['text'])
Run Code Online (Sandbox Code Playgroud)
texts和texts2数组之间的唯一区别是数据类型:
texts.dtype
dtype('<U92569')
texts2.dtype
dtype('O')
Run Code Online (Sandbox Code Playgroud)
您的第一个数组正在使用 NumPy 字符串 dtype。这些是固定宽度的,因此数组的每个元素占用的空间与数组中最长的字符串一样多,其中一个字符串的长度为 92569 个字符,从而增加了较短字符串的空间要求。
您的第二个数组正在使用对象 dtype。这只是保存对一堆常规 Python 对象的引用,因此每个元素都是一个常规 Python 字符串对象。每个元素都有额外的对象开销,但每个字符串只需要足够的空间来保存它自己的数据,而不是足够的空间来保存数组中最大的字符串。
此外,NumPy unicode dtypes 始终使用每个字符 4 个字节,而如果字符串不包含任何高代码点,Python 字符串对象使用较少。
| 归档时间: |
|
| 查看次数: |
44 次 |
| 最近记录: |