在机器内存不够的情况下如何处理大规模数据

背景介绍

笔者需要在一个内存为16G的远程服务器上处理几百G的数据,数据包含了几千个csv文件,所有文件存在了一个文件夹下。
目标:用python处理完所有数据,过滤出其中有用的部分。raw data中不同的文件之间有重复的数据(重复的行),最终得到的版本需要去重。(最终的去重后的部分是小于机器内存大小的)

解决方案

最直观的想法:将所有数据用pandas读取,然后通过pd.concat()合并成一个文件,再drop_duplicates(),然而数据量太大,无法读取所有数据。

优化想法:“分而治之”,将数据一部分一部分地处理,每一个部分先自己内部去重。全部数据这样一批一批的处理完后,再重复这个过程,直到只剩一个最终的文件。

具体代码

需要注意的细节:

  • 一开始我10个文件为一批的处理,结果有的时候超过内存大小,有的时候远小于内存大小,所有后来决定根据内存使用情况动态的决定多大为一批。
  • 注意python的内存处理机制,手动显式地delete 变量,然后回收内存。
import pandas as pd
import numpy as np
import os
path1 = '../csv_log_v4_07_13_1/'
files1 = [path1+item for item in os.listdir(path1)]
path2 = '../csv_log_v4_07_14/'
files2 = [path2+item for item in os.listdir(path2)]
files = files1 + files2def parse_file(raw_data):"""this function to parse every file"""'''保护隐私 删除部分细节'''omit details here for privacy concern return cur_fileimport os
import psutil
# 显示当前 python 程序占用的内存大小
def show_memory_info():pid = os.getpid()p = psutil.Process(pid)info = p.memory_full_info()memory = info.uss / 1024. / 1024 #MBreturn memory > 8.0*1024 # whether larger than 8 GBimport subprocessdef wc_count(file_name):'''count line number of a given file'''out = subprocess.getoutput("wc -l %s" % file_name)return int(out.split()[0])all_interaction_data = pd.DataFrame(columns=['user_id', 'photo_id', 'duration_ms', 'playing_time', 'request_time_ms', 'realshow'])from tqdm import tqdm
import gcinter_ls = []cnt = 1
for file in tqdm(files):cnt += 1if cnt < 151:continueif wc_count(file)>1: # whether has more than one lineraw_data = pd.read_csv(file, sep='#####', encoding='utf-8', engine='python')inter_ls.append(parse_file(raw_data))if show_memory_info():'''当内存快满了,立刻存储当下的内容,然后回收内存'''tmp_inter = pd.concat(inter_ls)tmp_inter.drop_duplicates(inplace=True)all_interaction_data = all_interaction_data.append(tmp_inter, ignore_index=True)del tmp_interdel inter_lsinter_ls = []all_interaction_data.drop_duplicates(inplace=True)all_interaction_data.to_csv(f'../immediate_data/all_rec_interaction_{cnt}.tsv', sep='\t', index=False)del all_interaction_datagc.collect()# global all_interaction_dataall_interaction_data = pd.DataFrame(columns=['user_id', 'photo_id', 'duration_ms', 'playing_time', 'request_time_ms', 'realshow'])all_interaction_data.to_csv(f'../immediate_data/all_rec_interaction_{cnt}.tsv', sep='\t', index=False)

内存不够的情况下python处理大规模数据相关推荐

  1. 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。 给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转

    有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度. 给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转 ...

  2. java中数组的内存模型_Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型+虚拟机原理能解决什么样问题...

    在上一篇文章中,小编为您详细介绍了关于<变频器调速问题?三星R458更换CPU>相关知识.本篇中小编将再为您讲解标题Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型 ...

  3. cassss服务未启动_Mysql无法启动情况下,如何恢复数据呢?

    本文适用于,mysql无法启动,但数据文件未丢失的情况. Mysql因意外情况,导致无法启动,数据库未做备份的情况下,如何将数据迁移至其他数据库中. 原数据库地址:192.168.1.100(以下简称 ...

  4. Excel(WPS)使用VBA,不打开文件情况下提取其他工作簿数据

    Excel(WPS)使用VBA,不打开文件情况下提取其他工作簿数据 提取函数,返回提取到的值 使用示例 在不打开工作簿的情况下,VBA读取其他工作簿数据 很多方法需要打开才能提取,如果没打开会显示错误 ...

  5. python批量读取grib_Windows下Python读取GRIB数据

    之前写了一篇<基于Python的GRIB数据可视化>的文章,好多博友在评论里问我Windows系统下如何读取GRIB数据,在这里我做一下说明. 一.在Windows下Python为什么无法 ...

  6. python读取grib文件_Windows下Python读取GRIB数据

    之前写了一篇<基于Python的GRIB数据可视化>的文章,好多博友在评论里问我Windows系统下如何读取GRIB数据,在这里我做一下说明. 一.在Windows下Python为什么无法 ...

  7. Android 无 EditText 情况下接受扫码枪扫描数据

    2019年04月12日更新,根据评论区反馈,可能不是很好用(但是我当时用的时候就是这么实现的),可以选择性尝试 Android 无 EditText 情况下接受扫码枪扫描数据 简单无脑! 去下载个 J ...

  8. 内存有限的情况下 Spark 如何处理 T 级别的数据?

    简单起见,下述答案仅就无shuffle的单stage Spark作业做了概要解释.对于多stage任务而言,在内存的使用上还有很多其他重要问题没有覆盖.部分内容请参考评论中  @邵赛赛  给出的补充. ...

  9. 线下沙龙 × 报名 | “大规模数据存储与挖掘”博士生研讨会

    每年进入11月 周围的气氛就变得莫名紧张 各位是不是已经开始全力冲刺 年底的实验和论文了? 当然是今年的双十一啦! 战队点赞了嘛? 签到领能量了嘛? 当双十一撞上年底的实验和论文 小编忍不住也想给本次 ...

最新文章

  1. 云服务器无法绑定公网IP问题解决方案
  2. 牛顿法求解方程(python和C++)
  3. Mac电脑如何输入command(⌘)、option(⌥)、shift(⇧)等特殊符号
  4. 创建华丽 UI 的 7条规则 第一部分 (2019年更新)
  5. 我写的这些opensource项目
  6. html表格的形式制作调查问卷,问卷调查表格式,问卷调查怎么制作?
  7. docker之run/cmd/entrypoint的区别
  8. [生存志] 第136节 相如辞赋神来之笔
  9. php--api发送钉钉消息
  10. foss测试_2016年十大FOSS法律案例
  11. 【CXY】JAVA基础 之 语法基础
  12. Windows11 Docker-Compose 因为挂载问题报错
  13. 罗永浩曾经深刻地改变过这个世界
  14. FPGA-Vivado
  15. 实验吧CTF-Who are you?
  16. 如何通过看电影学英语来源
  17. Common-pool源码编译——小例子
  18. 搜狗输入法人机交互设计的用户体验
  19. SAP HANA CLOUD – 入门指南
  20. mysql intersect用法格式_我们如何模拟MySQL INTERSECT查询?

热门文章

  1. 如何在Edit中切换为默认输入法
  2. es sql实现分页
  3. PHP同义词伪原创程序V1.0 修复增强版 自带4万+词库
  4. 机械工业出版社 c语言程序设计教程课后题,C语言程序设计
  5. JAVA——Java后端技术体系韩顺平框架图_韩顺平Java基础学习路线图
  6. 全网最详细的Python入门基础教程(非常详细,赶紧收藏)
  7. matlab 遗传算法工具箱(GATBX)
  8. 数据库链接失败问题,终于找到解决方案!
  9. USB摄像头方案及应用
  10. StringBuffer和StringBuilder