python处理大文件的内存问题

摘要:

同学们时常会遇到要处理大文件的情况,现在是大数据时代,有些文件动辄几十个G,我们在处理这样文件的时候一不小心就把内存撑爆了,或者程序被强制kill掉了。

原因是你一次性把文件的所有内容都读取到内存里面了。python里面有方法可以一段一段的读文件。

正文:

没错,就是用iterator,又叫迭代器,实例代码如下。

cat test.py

f = open(‘data‘, ‘r‘)

for line in f:

line = line.split(";;")

lines.append(line)

if len(lines) >= 10000:

# consume the lines which have been read

print lines

del lines[:]

if lines:

# consume the lines which have been read

print lines

cat data

73231701-201610;;shop_id::::73231701;;shop_name::::邂逅魅影;;platform_name::::xxxx;;shop_type::::个人卖家;;shop_loc::::xxx;;gold_seller::::否;;market_name::::taobao;;description::::NULL;;service::::NULL;;logistics::::NULL;;shop_owner::::洋洋103105;;create_time::::2012-08-15;;credit::::爱心4;;shop_age::::4;;co_name::::NULL;;shop_link::::https://shop73231701.example.com

73295319-201610;;shop_id::::73295319;;shop_name::::唯美为你最美;;platform_name::::xxxx;;shop_type::::个人卖家;;shop_loc::::xxx;;gold_seller::::否;;market_name::::taobao;;description::::NULL;;service::::NULL;;logistics::::NULL;;shop_owner::::chenyan121166563;;create_time::::2012-08-20;;credit::::钻石3;;shop_age::::4;;co_name::::NULL;;shop_link::::

https://shop73295319.example.com

上面的文件实际会很长,我这里只是写了两行,仅供参考。

“for line in f”每次都只会读取一行数据到内存,我们可以设置一个buffer,比如每10000行用list暂存下,处理完了之后再继续读取文件。

这样就实现了一段一段的读取文件内容到内存。是不是很酷!

赶紧试试吧!

时间: 2024-12-28 09:09:16

python处理大文件的内存问题的相关文章

python对大文件的增量读取

欢迎关注我的豆瓣http://www.douban.com/note/484517776/ 对于很多大文件的增量读取,如果遍历每一行比对历史记录的输钱或者全都加载到内存通过历史记录的索引查找,是非常浪费资源的,网上有很多人的技术博客都是写的用for循环readline以及一个计数器去增量读取,这样是十分脑残的,假如文件很大,遍历一次太久.  我们需要了解获取文件句柄的基本理论,其中包含的指针操作等.  原理是这样子,linux的文件描述符的struct里有一个f_pos的这么个属性,里面存着文件

python 在大文件里面删除某一行,比较有效率的方法

用 python 处理一个文本时,想要删除其中中某一行,常规的思路是先把文件读入内存,在内存中修改后再写入源文件. 但如果要处理一个很大的文本,比如GB级别的文本时,这种方法不仅需要占用很大内存,而且一次性读入内存时耗费时间,还有可能导致内存溢出. 所以,需要用另外一个思路去处理. 我们可以使用 open() 方法把需要修改的文件打开为两个文件,然后逐行读入内存,找到需要删除的行时,用后面的行逐一覆盖.实现方式见以下代码. 1 with open('file.txt', 'r') as old_

python读取大文件

最近在学习python的过程中接触到了python对文件的读取.python读取文件一般情况是利用open()函数以及read()函数来完成: f = open(filename,'r') f.read() 这种方法读取小文件,即读取远远大小小于内存的文件显然没有什么问题.但是如果是将一个10G大小的日志文件读取,即文件大于内存的大小,这么处理就有问题了,会造成MemoryError ... 也就是发生内存溢出. 发生这种错误的原因在于,read()方法执行操作是一次性的都读入内存中,显然文件大

python 读取大文件

要读取个大文件,文件大概是3G左右,担心read会出现内存溢出的情况,网上找了个靠谱的用法: with open(...) as f: for line in f: <do something with line> The with statement handles opening and closing the file, including if an exception is raised in the inner block. The for line in f treats the

python学习——大文件分割与合并

在平常的生活中,我们会遇到下面这样的情况: 你下载了一个比较大型的游戏(假设有10G),现在想跟你的同学一起玩,你需要把这个游戏拷贝给他. 然后现在有一个问题是文件太大(我们不考虑你有移动硬盘什么的情况),假设现在只有一个2G或4G的优盘,该怎么办呢? 有很多方法,例如winrar压缩的时候分成很多小卷,这里不累述. 在学习python之后,我们自己就可以解决这个问题啦. 我们可以自己写一个脚本去分割合并文件,将文件分割成适合优盘大小的小文件,在拷贝,然后再合并. 下面是文件分割脚本: 1 im

python读取大文件的方法

python计算文件的行数和读取某一行内容的实现方法 :最简单的办法是把文件读入一个大的列表中,然后统计列表的长度.如果文件的路径是以参数的形式filepath传递的,那么只用一行代码就可以完成我们的需求了: 1.http://blog.csdn.net/shudaqi2010/article/details/54017766 2.https://www.cnblogs.com/yu-zhang/p/5949696.html 3.http://blog.csdn.net/churximi/art

Python 读取大文件的方式

对于读取容量小的文件,可以使用下面的方法: with open("path", "r") as f: f.read() 但是如果文件容量很大,高达几个G或者十几个G,使用上面这种方式就容易造成内存溢出的问题,所以如果进行大容量的文件读取建议使用下面这种方式: with open("path", "r") as f: # f 是一个可迭代的文件对象 for line in f: # 以行为单位进行读取 print(line) 原

Python将一个大文件按段落分隔为多个小文件的简单方法

今天帮同学处理一点语料.语料文件有点大,并且是以连续两个换行符作为段落标志,他想把它按段落分隔成多个小文件,即每3个段落组成一个新文件.由于以前没有遇到过类似的操作,在网上找了一些相似的方法,看起来都有点复杂.所以经尝试,自己写了一段代码,完美解决问题. 基本思路是,先读原文件内容,并使用正则表达式,依据\n\n进行切片处理,结果为一个列表,其中每一个列表元素都存放一个切片中的内容:然后创建一个写文件的句柄:接下来遍历切片列表,并写入当前切片内容,判断是否已经写入了3个段落,如果不是,则继续读写

python 读取大文件越来越慢(判断 key 在 map 中,千万别用 in keys())

背景: 今天乐乐姐写代码,读取一个四五百兆的文件,然后做一串的处理.结果处理了一天还没有出来结果.问题出在哪里呢? 解决: 1. 乐乐姐打印了在不同时间点的时间,直接print time() 即可.发现一个规律,执行速度是越来越慢的. 2. 为什么会越来越慢呢? 1)可能原因1,GC 的问题,有篇文章里面写,python list append 的时候会越来越慢,解决方案是禁止GC: 使用 gc.disable()和gc.enable() 2)改完上面,仍然不行,然后看到一篇文章里面写,可能是因