堆栈溢出,

我正在从事一个涉及一些大文件(10-50Gb)的基因组学项目,我想将这些文件读入Python 2.7进行处理。我不需要将整个文件读到内存中,而是简单地逐行读取每个文件,执行一个小任务,然后继续。

我发现类似的问题,并尝试实施一些解决方案:

当我在17Gb文件上运行以下代码时:

脚本1(itertools):

#!/usr/bin/env python2importsysimportstringimportosimportitertoolsif__name__=="__main__":#Read in PosListposList=[]withopen("BigFile")asf:forlineiniter(f):posList.append(line.strip())sys.stdout.write(str(sys.getsizeof(posList)))

脚本2(文件输入):

#!/usr/bin/env python2importsysimportstringimportosimportfileinputif__name__=="__main__":#Read in PosListposList=[]forlineinfileinput.input(['BigFile']):posList.append(line.strip())sys.stdout.write(str(sys.getsizeof(posList)))

SCRIPT3(用于行):

#!/usr/bin/env python2importsysimportstringimportosif__name__=="__main__":#Read in PosListposList=[]withopen("BigFile")asf:forlineinf:posList.append(line.strip())sys.stdout.write(str(sys.getsizeof(posList)))

SCRIPT4(收益):

#!/usr/bin/env python2importsysimportstringimportosdefreadInChunks(fileObj,chunkSize=30):whileTrue:data=fileObj.read(chunkSize)ifnotdata:breakyielddataif__name__=="__main__":#Read in PosListposList=[]f=open('BigFile')forchunkinreadInChunks(f):posList.append(chunk.strip())f.close()sys.stdout.write(str(sys.getsizeof(posList)))

在17Gb文件中,Python中最终列表的大小约为5%(来自sys.getsizeof()),但根据“顶部”,每个脚本使用的内存都超过43Gb。

我的问题是:为什么内存使用率比输入文件或最终列表高得多?如果最终列表只有5Gb,并且正在逐行读取17Gb文件输入,为什么每个脚本的内存使用量都达到约43Gb?有没有更好的方法可以读取大文件而不会发生内存泄漏(如果那就是它们的话)?

非常感谢。

编辑:

从'/ usr / bin / time -v python script3.py'输出:

Commandbeing timed:"python script3.py"Usertime(seconds):159.65Systemtime(seconds):21.74Percentof CPU this job got:99%Elapsed(wall clock)time(h:mm:ssorm:ss):3:01.96Averageshared text size(kbytes):0Averageunshared data size(kbytes):0Averagestack size(kbytes):0Averagetotal size(kbytes):0Maximumresident set size(kbytes):181246448Averageresident set size(kbytes):0Major(requiring I/O)page faults:0Minor(reclaiming a frame)page faults:10182731Voluntarycontext switches:315Involuntarycontext switches:16722Swaps:0Filesystem inputs:33831512Filesystem outputs:0Socketmessages sent:0Socketmessages received:0Signalsdelivered:0Pagesize(bytes):4096Exitstatus:0

从顶部输出:

15816user200727m609m2032R76.80.50:02.31python15816user2001541m1.4g2032R99.61.10:05.31python15816user2002362m2.2g2032R99.61.70:08.31python15816user2003194m3.0g2032R99.62.40:11.31python15816user2004014m3.8g2032R99.630:14.31python15816user2004795m4.6g2032R99.63.60:17.31python15816user2005653m5.3g2032R99.64.20:20.31python15816user2006457m6.1g2032R99.34.90:23.30python15816user2007260m6.9g2032R99.65.50:26.30python15816user2008085m7.7g2032R99.96.10:29.31python15816user2008809m8.5g2032R99.66.70:32.31python15816user2009645m9.3g2032R99.37.40:35.30python15816user20010.3g10g2032R99.680:38.30python15816user20011.1g10g2032R1008.60:41.31python15816user20011.8g11g2032R99.99.20:44.32python15816user20012.7g12g2032R99.39.90:47.31python15816user20013.4g13g2032R99.610.50:50.31python15816user20014.3g14g2032R99.911.10:53.32python15816user20015.0g14g2032R99.311.70:56.31python15816user20015.9g15g2032R99.912.40:59.32python15816user20016.6g16g2032R99.6131:02.32python15816user20017.3g17g2032R99.613.61:05.32python15816user20018.2g17g2032R99.914.21:08.33python15816user20018.9g18g2032R99.614.91:11.33python15816user20019.9g19g2032R10015.51:14.34python15816user20020.6g20g2032R99.316.11:17.33python15816user20021.3g21g2032R99.616.71:20.33python15816user20022.3g21g2032R99.917.41:23.34python15816user20023.0g22g2032R99.6181:26.34python15816user20023.7g23g2032R99.618.61:29.34python15816user20024.4g24g2032R99.619.21:32.34python15816user20025.4g25g2032R99.319.91:35.33python15816user20026.1g25g2032R99.920.51:38.34python15816user20026.8g26g2032R99.921.11:41.35python15816user20027.4g27g2032R99.621.71:44.35python15816user20028.5g28g2032R99.622.31:47.35python15816user20029.2g28g2032R99.922.91:50.36python15816user20029.9g29g2032R99.623.51:53.36python15816user20030.5g30g2032R99.624.11:56.36python15816user20031.6g31g2032R99.624.71:59.36python15816user20032.3g31g2032R10025.32:02.37python15816user20033.0g32g2032R99.625.92:05.37python15816user20033.7g33g2032R99.626.52:08.37python15816user20034.3g34g2032R99.627.12:11.37python15816user20035.5g34g2032R99.627.72:14.37python15816user20036.2g35g2032R99.628.42:17.37python15816user20036.9g36g2032R100292:20.38python15816user20037.5g37g2032R99.629.62:23.38python15816user20038.2g38g2032R99.630.22:26.38python15816user20038.9g38g2032R99.630.82:29.38python15816user20040.1g39g2032R10031.42:32.39python15816user20040.8g40g2032R99.6322:35.39python15816user20041.5g41g2032R99.632.62:38.39python15816user20042.2g41g2032R99.933.22:41.40python15816user20042.8g42g2032R99.633.82:44.40python15816user20043.4g43g2032R99.634.32:47.40python15816user20043.4g43g2032R10034.32:50.41python15816user20038.6g38g2032R10030.52:53.43python15816user20024.9g24g2032R99.719.62:56.43python15816user20012.0g11g2032R1009.42:59.44python

编辑2:

为了进一步澄清,这里是问题的扩展。我在这里所做的是读取FASTA文件中的位置列表(Contig1 / 1,Contig1 / 2等)。通过以下方式将其转换为充满N的字典:

keys=posList

values=['N']*len(posList)speciesDict=dict(zip(keys,values))

然后,我正在读取多个物种的堆积文件,再次逐行(将存在相同问题的地方),并通过以下方式获得最终的碱基检出:

withopen(path+'/'+os.path.basename(path)+'.pileups',"r")asfilein:forlineiniter(filein):splitline=line.split()iflen(splitline)>4:node,pos,ref,num,bases,qual=line.split()loc=node+'/'+pos

cleanBases=getCleanList(ref,bases)finalBase=getFinalBase_Pruned(cleanBases,minread,thresh)speciesDict[loc]=finalBase

由于特定于物种的堆积文件的长度或顺序不同,因此,我正在创建列表以创建一种“公共花园”方式来存储单个物种数据。如果某个物种的给定站点没有可用的数据,则会调用“ N”。否则,将在词典中为该站点分配一个碱基。

最终结果是每个物种的文件,这些文件是有序的和完整的,我可以从中进行下游分析。

因为逐行读取正在消耗大量内存,所以即使最终数据结构比我预期的所需内存小得多,读取两个大文件也会使我的资源超载(增长列表的大小+单个内存)一次要添加数据的行)。

解决方案

sys.getsizeof(posList) is not giving you what I think you think it is: it's telling you the size of the list object containing the lines; this does not include the size of the lines themselves. Below are some outputs from reading a roughly 3.5Gb file into a list on my system:

In[2]:lines=[]In[3]:withopen('bigfile')asinf:...:forlineininf:...:lines.append(line)...:In[4]:len(lines)Out[4]:68318734In[5]:sys.getsizeof(lines)Out[5]:603811872In[6]:sum(len(l)forlinlines)Out[6]:3473926127In[7]:sum(sys.getsizeof(l)forlinlines)Out[7]:6001719285

That's a bit over six billion bytes, there; in top my interpreter was using about 7.5Gb at this point.

Strings have considerable overhead: 37 bytes each, it looks like:

In[2]:sys.getsizeof('0'*10)Out[2]:47In[3]:sys.getsizeof('0'*100)Out[3]:137In[4]:sys.getsizeof('0'*1000)Out[4]:1037

So if your lines are relatively short, a large part of the memory use will be overhead.

python01g内存读取10g文件并排序_将大文件逐行读取到Python2.7中时的内存使用相关推荐

  1. python大文件排序_Python如何实现大文件排序?Python大文件排序的实现方法

    Python如何实现大文件排序?Python大文件排序的实现方法 本文实例讲述了Python实现大文件排序的方法.分享给大家供大家参考.具体实现方法如下: import gzip import os ...

  2. mysql 读取文件_关于mysql:逐行读取文件而不将整个文件加载到内存中

    我正在使用50 Gb MySQL导出文件,并对其执行脚本操作列表以转换为SQLite3可加载形式(我从这里得到的线索:脚本将mysql dump sql文件转换为可以导入sqlite3的格式D b ) ...

  3. java 文件内容排序_在Java中对2个大型文本文件进行排序的最佳方法是什么?

    我正在构建一个简单的 Java应用程序,涉及从csv文件中读取信息. csv文件中的信息以这种形式出现: "ID","Description" "AB ...

  4. python 导入数据对不齐_[Python] 大文件数据读取分析

    首先我们可以确定的是不能用read()与readlines()函数: 因为如果将这两个函数均将数据全部读入内存,会造成内存不足的情况. 针对数据按行划分的文件 以计算行数为例,首先针对几种不同的方法来 ...

  5. python读取大文件的某行_python 大文件以行为单位读取方式比对

    先前需要做一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工作.做了很多的尝试,最终看到了如下的文章. 该文章实际上提供了集中读取大文件的方式,先经过测试总结如下 1. for l ...

  6. 微信文件夹的dat文件怎么打开_微信dat文件如何打开?

    微信dat转码软件使用操作说明在线解码,各位同学下载软件后,如何操作?如何找到dat文件?如何使用?又有哪些注意事项呢?这里会为大家一一道来.问题1 :如果下载失败怎么办?请先检查网络,软件并没有放在 ...

  7. csv文件 内容转义_保存csv文件时的生僻字处理和格式控制

    应用场景 Web应用中导入导出报表是一个非常常见的需求,而普通用户使用最多的表格文件都是用Excel保存的. 一般来说,对于数据量较小的导入导出,使用xls/xlsx文件和用户交互是最佳选择,即有相应 ...

  8. 微信文件夹的dat文件怎么打开_微信dat文件怎么打开?

    先给大家安利个好用的软件吧 各位同学下载软件后,如何操作?如何找到dat文件?如何使用?又有哪些注意事项呢? 这里会为大家一一道来. 问题1 :如果下载失败怎么办? 请先检查网络,软件并没有放在我的网 ...

  9. node 生产的env文件怎么注入_前端各种文件上传攻略,从小图片到大文件断点续传...

    写在前面 今年国庆假期终于可以憋在家里了不用出门了,不用出去看后脑了,真的是一种享受.这么好的光阴怎么浪费,睡觉.吃饭.打豆豆这怎么可能(耍多了也烦),完全不符合我们程序员的作风,赶紧起来把文章写完. ...

最新文章

  1. CDN的工作原理以及其中的一些技术-阿里
  2. Cookie的特点和作用|| 案例:记住上一次访问时间
  3. 基于Spring Boot的“课程设计”的设计与实现
  4. python中yield的用法详解——最简单,最清晰的解释(转载)
  5. React+Webpack快速上手指南
  6. Qt中的QString和QByteArray之间转换
  7. 第一次用PHP做电影站 用thinkphp开发的!!
  8. javascript动态字母
  9. 数据库优化实践【信息跟踪篇】
  10. Android源码学习之环境搭建(Ubuntu下载Android源码)
  11. STS下载教程(include官网无法下载解决方案)
  12. 6.5 使用快捷键快速调整图表线条的宽度 [原创Excel教程]
  13. autocad ios 虚线_autocad中画箭头、虚线绘制方法介绍
  14. JavaScript系列(2)内置对象:Date
  15. mathtype打出花体小写字母
  16. PostgreSQL JDBC 驱动程序版本和JDK关系及下载地址
  17. android studio的旅游APP的开发和设计
  18. java导出excel合并单元格
  19. ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet:学习教程目录
  20. Java如何模拟鼠标键盘输入

热门文章

  1. ubuntu18.04安装Nvidia显卡
  2. python特征数据类型及常用操作对比总结_如何全面解析数据并创造数据故事
  3. 比较两个数或者三个数的大小,输出较大数的值 Java
  4. tracker使用_如何使用Tracker查找钥匙,钱包,电话或其他任何东西
  5. 2020年某计算机菜鸡的中九保研之旅(武大、华科、北理、西交、中山)
  6. Java学习Day_11
  7. android pad课件制作软件,平板电脑可以做ppt吗
  8. 计算机电源选平衡,电脑里选择电源计划哪个好
  9. RAC环境备份归档日志和RMAN恢复启动数据库
  10. 磁盘管理器中不显示新增的硬盘