一个10G的文件,但是内存只有4G,使用python如何进行性能调优?

Posted 七月的小尾巴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个10G的文件,但是内存只有4G,使用python如何进行性能调优?相关的知识,希望对你有一定的参考价值。

有一个jsonline格式的文件file.txt大小约为10K

def get_lines(): 
	with open('file.txt','rb') as f: 
		return f.readlines() 
		
if __name__ == '__main__': 
	# 处理每一行数据
	for e in get_lines(): 
		process(e) 

假设现在要处理一个大小为10G的文件,但是内存只有4G,如果在只修改get_lines 函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有那些?

def get_lines(): 
	with open('file.txt','rb') as f: 
		for i in f: 
			yield i

个人认为:还是设置下每次返回的行数较好,否则读取次数太多。

def get_lines(): 
	l = [] 
	with open('file.txt','rb') as f: 	
		data = f.readlines(60000) 
	l.append(data) 
	yield l

Pandaaaa906提供的方法

from mmap import mmap 

def get_lines(fp): 
	with open(fp,"r+") as f: 
		m = mmap(f.fileno(), 0) 
		tmp = 0 
		for i, char in enumerate(m): 
			if char==b"\\n": 
			yield m[tmp:i+1].decode() 
			tmp = i+1 

if __name__=="__main__": 
	for i in get_lines("fp_some_huge_file"):
		print(i)

要考虑的问题有:内存只有4G无法一次性读入10G文件,需要分批读入分批读入数据要记录每次读入数据的位置。分批每次读取数据的大小,太小会在读取操作花费过多时间。

以上是关于一个10G的文件,但是内存只有4G,使用python如何进行性能调优?的主要内容,如果未能解决你的问题,请参考以下文章

安装Oracle 10g过程中出现指定的SID已经存在 怎么处理才可以继续安装

电脑C盘空间不足-虚拟内存占用10G

windows运行Elasticsearch内存占用过大

linux备份到FAT32U盘大于4G会自动切分吗

ETH 4G DAG问题及其对策

ESXi 强制4G内存解决(VMware ESXi 6.0.0.update02 )