python分块处理超过内存数据思路

如果处理的数据大于电脑内存,分块处理文件,再把处理好的文件输出

# -*- coding: utf-8 -*-
"""
Created on Sun Mar 21 16:25:16 2021

@author: sen
"""

import pandas as pd
import numpy as np
import os
import random
os.chdir("F://Code_sen//Data//data_500M")


def genSizeFile(fileName, fileSize):
    #文件名
    filePath="Data"+fileName+".txt"

    # 生成固定大小的文件,数据有三列
    # date size
    ds=0
    i=0
    lst = ['a','b','c']
    with open(filePath, "w", encoding="utf-8") as f:
        while ds<fileSize:
            i = i + 1
            f.write(str(i)+","+str(round(random.uniform(-1000, 1000),2))+","+str(random.sample(lst, 1)))
            f.write("\n")
            ds=os.path.getsize(filePath)
    print(os.path.getsize(filePath))

# start here.
genSizeFile("100M",100*1024*1024)

def genNFile(fileNum):
    # 生成固定行的文件
    numCount=fileNum
    numRange=3*numCount
    tmpList=random.sample(range(numRange), numCount)

    i=0
    filePath=""+str(numCount)+".txt"
    with open(filePath, "w", encoding="utf8") as f:
       while i<numCount:
        f.write(str(tmpList[i]))
        f.write("\n")
        i=i+1

#1、指定chunksize分块读取文件  原理就是不一次性把文件数据读入内存中,而是分多次。
#read_csv 和 read_table 有一个 chunksize 参数,
#用以指定一个块大小(每次读取多少行),返回一个可迭代的 TextFileReader 对象。
table=pd.read_table('Data100M.txt',
                    sep=',',#指定数据中变量之间的分隔符,注意这里是中文的逗号
                    header=None , #不需要将原来的数据中的第一行读作表头
                    names=['id','event','name'] , #重新为各列起变量名称
                    #converters={'id':str} ,#将ID转换为字符串,以免开头的00消失
                    chunksize=1000000
                    )
#table=pd.read_table('Data100M.txt',
#                    sep=',',#指定数据中变量之间的分隔符,注意这里是中文的逗号
#                    header=None , #不需要将原来的数据中的第一行读作表头
#                    names=['id','event','name'] , #重新为各列起
#                    )
#table.head()
#table2 = table.head()
#table['name'].value_counts()
#['a']    1584844
#['c']    1584844
#['b']    1584522
#ddd = table2['name'].str[2:3]

i = 0
for df in table:
    i = i + 1
    #对df处理,第三列['a'] 只保留字母部分
    df['new'] = df['name'].str[2:3]
    print(type(df),df.shape)
    print(i)
    df.to_csv('filename%i.txt' %i, sep=',',header=None , index=False)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值