pythonread_csvchunk_Pythonchunk读取超⼤⽂件16GB⼩⽔存已经不能适应动辄4GB、8GB的数据⽂件了。
查询到pandas的read_csv()提供了chunk分块读取能⼒。
官⽅⽰例
这是⼀张原始的table
In [185]: table = pd.read_csv('tmp.sv', sep='|')
In [186]: table
Out[186]:
Unnamed: 0 0 1 2 3
0 0 0.469112 -0.282863 -1.509059 -1.135632
1 1 1.21211
2 -0.173215 0.119209 -1.044236
2 2 -0.861849 -2.104569 -0.494929 1.071804
3 3 0.721555 -0.706771 -1.039575 0.271860
4 4 -0.424972 0.567020 0.276232 -1.087401
5 5 -0.673690 0.113648 -1.478427 0.524988
6 6 0.404705 0.577046 -1.715002 -1.039268
7 7 -0.370647 -1.157892 -1.344312 0.844885
8 8 1.075770 -0.109050 1.643563 -1.469388
9 9 0.357021 -0.674600 -1.776904 -0.968914
指定chunksize=4,表明每4⾏为1个chunk。
In [187]: reader = pd.read_csv('tmp.sv', sep='|', chunksize=4)
In [188]: reader
Out[188]: In [189]: for chunk in reader:
.....: print(chunk)
.....:
Unnamed: 0 0 1 2 3
0 0 0.469112 -0.282863 -1.509059 -1.135632
python怎么读csv数据1 1 1.21211
2 -0.173215 0.119209 -1.044236
2 2 -0.861849 -2.104569 -0.494929 1.071804
3 3 0.721555 -0.706771 -1.039575 0.271860
Unnamed: 0 0 1 2 3
4 4 -0.424972 0.567020 0.276232 -1.087401
5 5 -0.673690 0.113648 -1.478427 0.524988
6 6 0.404705 0.577046 -1.715002 -1.039268
7 7 -0.370647 -1.157892 -1.344312 0.844885
Unnamed: 0 0 1 2 3
8 8 1.075770 -0.10905 1.643563 -1.469388
9 9 0.357021 -0.67460 -1.776904 -0.968914
返回的reader是TextFileReader类型,它指向若⼲个chunk位置,只在访问数据的时候才真正把数据读⼊到内存。这是⼀个可迭代的类型,采⽤for in的形式,即可逐个访问chunk。
每个chunk都是dataframe类型的。
还有⼀个⽤法。
如果想跟数组⼀样,访问第i个chunk要怎么做?
使⽤ get_chunk(i)这个函数就可以了。
但是根据测试,get_chunk(i),在我这台机⼦上是固定10⾏为1个chunk,不受chunksize参数调整。
挺邪乎。
In [190]: reader = pd.read_csv('tmp.sv', sep='|', iterator=True)
In [191]: _chunk(5)
Out[191]:
Unnamed: 0 0 1 2 3
0 0 0.469112 -0.282863 -1.509059 -1.135632
1 1 1.21211
2 -0.173215 0.119209 -1.044236
2 2 -0.861849 -2.104569 -0.494929 1.071804
3 3 0.721555 -0.706771 -1.039575 0.271860
4 4 -0.424972 0.567020 0.276232 -1.087401
//官⽅地址:/pandas-docs/stable/user_guide/io.html#io-chunking
实践⼿册
1.获取⾏数
count = 0
fp = open('totalExposureLog.out','r', encoding='utf-8')
while 1:
buffer = fp.read(8*1024*1024)
if not buffer:
break
count += unt('\n')
print(count)
fp.close()
//blog.csdn/u012762054/article/details/78384294
这样你⼼⾥就有x数了,知道这个⽂件有多少⾏。
估算⾃⼰的内存⼤概撑得住多少⾏的数据,把原始数据划分为多少块⽐较合适。
例如我这个⽂件有102386695⾏,四舍五⼊1个亿。
⼤概划分成500万⾏,20个chunk就可以了。
2.使⽤chunk来read_csv
#1亿⾏,每500w为1个chunk
reader = pd.read_csv('totalExposureLog.out', sep='\t',chunksize=5000000) for i,ck in enumerate(reader):
print(i,' ',len(ck))
<_csv('../data/bb_'+str(i)+'.csv', index=False)
迭代访问即可。
3.合并表
使⽤at
当axis = 0时,concat的效果是列对齐。
#我的数据分了21个chunk,标号是0~20
loader = [pd.read_csv('../data/bb_'+str(i)+'.csv') for i in range(21)]
⼀般来说⼩⽔存是不可能把21个chunk都concat到⼀起的。
根据实际情况调整吧。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。