python - 泡菜字符串与泡菜数字,硬盘上不同的泡菜文件大小
问题描述
我有两个数据框。一个有字符串列,另一个只有数字。它们在内存中的大小相同,但在腌制时,它们在硬盘驱动器上的文件大小不同。
这是代码:
import pandas as pd
import numpy as np
import pickle
import random
import string
import sys
output_dir = './output/'
max_r = 2000
max_c = 1000
numerical_df = pd.DataFrame(np.random.rand(max_r, max_c))
with open(output_dir + 'numerical_df' + '.pkl', 'wb') as fout:
pickle.dump(numerical_df, fout)
categorical_df = pd.DataFrame()
for j in range(int(max_c/10.8)):
categorical_df['dummy_object_col'+str(j)] = [''.join(random.choices(string.ascii_uppercase + string.digits, k=30))]*max_r
with open(output_dir + 'categorical_df' + '.pkl', 'wb') as fout:
pickle.dump(categorical_df, fout)
print('sys.getsizeof ' + 'numerical_df ' + str(sys.getsizeof(numerical_df)/(1024)))
print('memory_usage ' + 'numerical_df ' + str(numerical_df.memory_usage(index=True, deep=True).sum()/(1024)))
print('sys.getsizeof ' + 'categorical_df ' + str(sys.getsizeof(categorical_df)/(1024)))
print('memory_usage ' + 'categorical_df ' + str(categorical_df.memory_usage(index=True, deep=True).sum()/(1024)))
这是显示两个数据帧具有几乎相同的内存大小(以 KB 为单位)的输出:
sys.getsizeof numerical_df 15625.140625
memory_usage numerical_df 15625.125
sys.getsizeof categorical_df 15632.953125
memory_usage categorical_df 15632.9375
当我查看硬盘驱动器上的腌制文件大小时,它们是不同的。似乎字符串比数字更压缩。使用的字符数不会减少文件大小的差异。用 k=1、k=30 和 k=60 进行测试。
categorical_df.pkl has 821 KB
numerical_df.pkl has 15626 KB
当我更改代码以在每列上使用随机字符串时,我得到不同的文件大小,这是新的数据框:
categorical_df2 = pd.DataFrame()
for j in range(int(max_c/10.8)):
random_strs = []
for i in range(max_r):
random_strs.append(''.join(random.choices(string.ascii_uppercase + string.digits, k=30)))
categorical_df2['dummy_object_col'+str(j)] = random_strs
输出:
sys.getsizeof numerical_df 15625.140625
memory_usage numerical_df 15625.125
sys.getsizeof categorical_df 15632.953125
memory_usage categorical_df 15632.9375
sys.getsizeof categorical_df2 15632.953125
memory_usage categorical_df2 15632.9375
腌制文件的大小:
categorical_df.pkl has 821 KB
categorical_df2.pkl has 5944 KB
numerical_df.pkl has 15626 KB
问题是pickle lib为什么/如何以不同的方式转储字符串和数字,从而导致不同的pickle文件大小。
解决方案
推荐阅读
- java - 在不使用 JAVA 循环的情况下获取列表中包含“.txt”的索引
- reactjs - 如何运行 formatjs 编译?
- makefile - 在 autoconf 中,如何创建临时文件和测试 shell 命令?
- excel - VBA - 从范围中过滤多个数据并复制到多个工作表
- android - 从android studio中的firebase数据库中检索图像的问题
- javascript - 反应 onChange 方法未从组件运行
- reactjs - 我想将带有文本的图像从表单上传到快速服务器
- python - 处理多方法间路由的组织方法
- database - 如何通过shell脚本检查数据库连接?
- android - Mac OS 10.15 (Catalina) 是否支持 Android Studio?