Python Pickling pandas dataframe将文件大小乘以5

Python Pickling pandas dataframe将文件大小乘以5,python,csv,pandas,pickle,Python,Csv,Pandas,Pickle,我正在用pandas.read\u CSV读取一个800 Mb的CSV文件,然后使用原始Pythonpickle.dump(datfarame)保存它。结果是一个4 Gb的pkl文件,因此CSV大小乘以5 我希望pickle压缩数据而不是扩展数据。还因为我可以在CSV文件上做一个gzip,将其压缩到200MB,除以4 我愿意加快程序的加载时间,并认为酸洗会有所帮助,但考虑到磁盘访问是主要瓶颈,我理解我宁愿压缩文件,然后使用pandas.read_csv中的压缩选项来加快加载时间 对吗 酸洗熊猫数

我正在用pandas.read\u CSV读取一个800 Mb的CSV文件,然后使用原始Python
pickle.dump(datfarame)
保存它。结果是一个4 Gb的pkl文件,因此CSV大小乘以5

我希望pickle压缩数据而不是扩展数据。还因为我可以在CSV文件上做一个gzip,将其压缩到200MB,除以4

我愿意加快程序的加载时间,并认为酸洗会有所帮助,但考虑到磁盘访问是主要瓶颈,我理解我宁愿压缩文件,然后使用pandas.read_csv中的压缩选项来加快加载时间

对吗

酸洗熊猫数据帧扩展数据大小是否正常

您通常如何加快加载时间


pandas加载的数据大小限制是多少?

不要将
800MB
文件加载到内存中。这将增加您的加载时间。Pickle对象也需要更多的时间来加载。而是将csv文件存储为sqlite3(与python一起提供)表。然后根据需要每次查询表。

不确定为什么认为pickling会压缩数据大小,pickling会创建python对象的字符串版本,以便将其作为python对象加载回:

In [388]:

import sys
import os
df = pd.DataFrame({'a':np.arange(5)})
df.to_pickle(r'c:\data\df.pkl')
print(sys.getsizeof(df))
statinfo = os.stat(r'c:\data\df.pkl')
print(statinfo.st_size)
with open(r'c:\data\df.pkl', 'rb') as f:
    print(f.read())
56
700
b'\x80\x04\x95\xb1\x02\x00\x00\x00\x00\x00\x00\x8c\x11pandas.core.frame\x94\x8c\tDataFrame\x94\x93\x94)}\x94\x92\x94\x8c\x15pandas.core.internals\x94\x8c\x0cBlockManager\x94\x93\x94)}\x94\x92\x94(]\x94(\x8c\x11pandas.core.index\x94\x8c\n_new_Index\x94\x93\x94h\x0b\x8c\x05Index\x94\x93\x94}\x94(\x8c\x04data\x94\x8c\x15numpy.core.multiarray\x94\x8c\x0c_reconstruct\x94\x93\x94\x8c\x05numpy\x94\x8c\x07ndarray\x94\x93\x94K\x00\x85\x94C\x01b\x94\x87\x94R\x94(K\x01K\x01\x85\x94\x8c\x05numpy\x94\x8c\x05dtype\x94\x93\x94\x8c\x02O8\x94K\x00K\x01\x87\x94R\x94(K\x03\x8c\x01|\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK?t\x94b\x89]\x94\x8c\x01a\x94at\x94b\x8c\x04name\x94Nu\x86\x94R\x94h\rh\x0b\x8c\nInt64Index\x94\x93\x94}\x94(h\x11h\x14h\x17K\x00\x85\x94h\x19\x87\x94R\x94(K\x01K\x05\x85\x94h\x1f\x8c\x02i8\x94K\x00K\x01\x87\x94R\x94(K\x03\x8c\x01<\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94b\x89C(\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x94t\x94bh(Nu\x86\x94R\x94e]\x94h\x14h\x17K\x00\x85\x94h\x19\x87\x94R\x94(K\x01K\x01K\x05\x86\x94h\x1f\x8c\x02i4\x94K\x00K\x01\x87\x94R\x94(K\x03h5NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94b\x89C\x14\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x94t\x94ba]\x94h\rh\x0f}\x94(h\x11h\x14h\x17K\x00\x85\x94h\x19\x87\x94R\x94(K\x01K\x01\x85\x94h"\x89]\x94h&at\x94bh(Nu\x86\x94R\x94a}\x94\x8c\x060.14.1\x94}\x94(\x8c\x06blocks\x94]\x94}\x94(\x8c\x06values\x94h>\x8c\x08mgr_locs\x94\x8c\x08builtins\x94\x8c\x05slice\x94\x93\x94K\x00K\x01K\x01\x87\x94R\x94ua\x8c\x04axes\x94h\nust\x94bb.'

最好将CSV文件存储在某种数据库中,并对其执行操作,而不是按照建议将CSV文件加载到RAM中。您将看到加载时间的加速,这仅仅是因为您没有在每次加载脚本时填充800MB的RAM

文件压缩和加载时间是您试图完成的两个相互冲突的要素。压缩CSV文件并加载将花费更多时间;现在,您添加了必须解压缩文件的额外步骤,但这并不能解决您的问题

考虑将数据发送到
sqlite3
数据库的前兆步骤,如下所述:

现在,您可以查询数据的子集,并将其快速加载到
pandas.DataFrame
中以供进一步使用,如下所示:

from pandas.io import sql
import sqlite3

conn = sqlite3.connect('your/database/path')
query = "SELECT * FROM foo WHERE bar = 'FOOBAR';"

results_df = sql.read_frame(query, con=conn)
...

相反,您可以使用panda.DataFrame.to_sql()保存这些数据以备将来使用。

您还可以使用panda的pickle方法压缩数据

保存数据帧:

df.to_pickle(filename)
加载它:

df = pd.read_pickle(filename)

我试图用熊猫做数据分析。你是说熊猫不是泰勒德人,不会处理大数据吗?不是那样的。仅使用pandas,您可以直接查询或筛选sqlite3表。将数据存储在RAM中会占用RAM空间。如果您的数据增长怎么办?我必须说,数据不必增长到已经困扰我的小8GB:-我只是认为,任何保存算法都应该默认地尝试压缩数据。似乎我错了。@romainjouin但那会假设你总是可以打开一个压缩文件,可能有一个系统无法解压它,而在大多数系统上纯文本csv是可读的。我愿意通过压缩文件来赢得的时间是读取磁盘访问时间。我认为“动态”解压将在内存中完成,因此比访问磁盘上的数据要快。
df = pd.read_pickle(filename)