首页 > 解决方案 > 泡菜字符串与泡菜数字,硬盘上不同的泡菜文件大小

问题描述

我有两个数据框。一个有字符串列,另一个只有数字。它们在内存中的大小相同,但在腌制时,它们在硬盘驱动器上的文件大小不同。

这是代码:

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文件大小。

标签: pythondataframepickle

解决方案


推荐阅读