用pickle格式保存金融tick数据 减少内存占用

用pickle格式保存金融tick数据 减少内存占用

前言

降低数据集文件的内存占用是Quant需要解决的一个问题,特别是当你面对着几千只股票、上千个交易日的tick数据的时候。相比于csv文件,使用pickle文件进行存储也许是一个不错的解决方案,本文将探讨这一思路。当然,肯定还有更好的方案,本文就权当抛砖引玉了。

使用csv文件进行保存

作为例子,我这里直接生成了一个10万行的数据,如何获取tick数据的文章后期再补。

import pandas as pd
import os

ls = [[1, 2, 3] for _ in range(100000)]
data = pd.DataFrame(ls, columns=['a', 'b', 'c'])
data.to_csv("test.csv", index=False)
print(f"file size of csv: {os.path.getsize('test.csv')}")

运行结果是

file size of csv: 700007

os.path.getsize()得到的结果是字节,这个csv文件的大小是684KB

使用pickle文件进行保存

import pandas as pd
import os

ls = [[1, 2, 3] for _ in range(100000)]
data = pd.DataFrame(ls, columns=['a', 'b', 'c'])
data.to_pickle("test_before.pkl")
print(f"file size of pickle_before: {os.path.getsize('test_before.pkl')}")

运行结果是

file size of pickle_before: 2400709

保存的pickle文件的大小是2345KB
对,没看错,就是2345KB,可以试试,就是这么多,此车已翻~
使用pickle文件格式进行存储,不仅没有减少内存占用,反而多占了2、3倍的空间~

优化内存占用

刚刚翻车的原因是csv中文件的存储格式,可以使用下面的代码进行查看

print(data.dtypes)

运行结果是

a    int64
b    int64
c    int64

全是int64,岂能不大!!!
一个int64占用8个字节,所以刚刚保存pickle文件中的2400709字节其实很好理解,约等于 8 ∗ 3 ∗ 100000 8*3*100000 83100000
问题找到了,解决方案也就有了。这里,实际上使用int8足以,因此

import pandas as pd
import os

ls = [[1, 2, 3] for _ in range(100000)]
data = pd.DataFrame(ls, columns=['a', 'b', 'c'])
data = data.astype('int8')
data.to_pickle("test_after.pkl")
print(f"file size of pickle_after: {os.path.getsize('test_after.pkl')}")

运行结果是

file size of pickle_after: 300707

300707字节约等于 1 ∗ 3 ∗ 100000 1*3*100000 13100000

总结

本文对比了使用csv文件格式、pickle文件格式和优化数据类型后的pickle文件格式分别占用的内存大小,结果汇总如下

file size of csv: 700007
file size of pickle_before: 2400709
file size of pickle_after: 300707

从结果中可以看出,文件大小从之前的700007下降到了300707,下降了一倍有余,而结果并不会受影响。

import pickle
with open("test_after.pkl", "rb") as f:
    data = pickle.load(f)
print(data)

运行结果是

       a  b  c
0      1  2  3
1      1  2  3
2      1  2  3
3      1  2  3
4      1  2  3
...   .. .. ..
99995  1  2  3
99996  1  2  3
99997  1  2  3
99998  1  2  3
99999  1  2  3

[100000 rows x 3 columns]
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值