【发布时间】:2016-06-04 16:28:14
【问题描述】:
我正在编写一段在 Python 中使用对象的代码。我有 1.1GB 的文件需要解析并转换为对象。
但是,有 1.1GB 的文件,它消耗 超过 7GB 的内存(我停止了它,因为它可以走得更远......),这是挺大。我使用内存分析器检查并查看发生了什么,并且...有我得到的结果示例:
Line # Mem usage Increment Line Contents
================================================
78 30.352 MiB 0.000 MiB @profile
79 def getInfos(listExch):
80
81 30.352 MiB 0.000 MiB SizeTot = 0
82 30.352 MiB 0.000 MiB upListExch = set()
83
84 5325.996 MiB 5295.645 MiB for exch in listExch:
85
86
87 5325.996 MiB 0.000 MiB symbExch = exch.symb
88 5325.996 MiB 0.000 MiB nameExch = exch.name
89 5325.996 MiB 0.000 MiB stList = exch.getStList()
90 5325.996 MiB 0.000 MiB upExch = Exch(symbExch,nameExch)
91
92 7572.309 MiB 2246.312 MiB for st in stList:
93
94 7572.309 MiB 0.000 MiB unexpected = False
95 7572.309 MiB 0.000 MiB symbSt = st.symb
96
97 7572.309 MiB 0.000 MiB filepath = '{0}/{1}.csv'.format(download_path,symbSt)
98
99 7572.309 MiB 0.000 MiB upSt = parseQ(st,filepath)
100 7572.309 MiB 0.000 MiB upExch.addSt(upSt)
101 5325.996 MiB -2246.312 MiB upListExch.add(upExch)
102
103 return upListExch
下面还有我写的对象模型:
Exch 是一个包含listSt 的对象,每个St 包含一个listQ 的对象。
class Exch:
def __init__(self,symb,name):
self.symb = symb
self.name = name
self.listSt = set()
def addSt(self,st):
self.listSt.add(st)
def setStList(self,listSt):
self.listSt = listSt
def getStList(self):
return self.listSt
class St:
def __init__(self,symb,name):
self.symb = symb
self.name = name
self.listQ = set()
def getQList(self):
return self.listQ
def addQ(self,q):
self.listQ.add(q)
class Q:
def __init__(self,date,dataH,dataM,dataL):
self.date = date
self.dataH = dataH
self.dataM = dataM
self.dataL = dataL
我在这里做错了吗?还是 Python 不适应这种数据量?
编辑:
输入listExch包含Exch对象列表,每个st到listSt包含一个空listQ
输出将与输入相同,除了每个st 对象中的每个listQ 将被添加。
解析器已经制作完成:
def parseQ(st,filepath):
loc_date,loc_dataH,loc_dataM,loc_dataL = 0,0,0,0
with open (filepath, 'rt') as csvfile:
reader = csv.reader (csvfile,delimiter=',')
row1 = next(reader)
unexpected = False
for idx,el in enumerate(row1):
if (el == 'Date'):
loc_date = idx
elif (el == 'Number High'):
loc_dataH = idx
elif (el == 'Number Medium'):
loc_dataM = idx
elif (el == 'Number Low'):
loc_dataL = idx
else:
log.error('Unexpected format on file {}. Skip the file'.format(filepath))
unexpected = True
break
if (unexpected):
log.error('The file "{}" is not properly set'.format(filepath))
return False
else:
next(reader)
for row in reader:
try:
st.addQ(Q(row[loc_date],row[loc_dataH],row[loc_dataM],row[loc_dataL]))
return st
【问题讨论】:
-
s/Go/GB/g?还是“围棋”是我不知道的计量单位?
-
@user161778 gigaoctet
-
@AnttiHaapala,这清除了它,谢谢!
-
您能否添加一些细节(或告诉我在哪里,例如它已经显示的分析)您对 csv 数据的实际操作。也许是驱动转换的代码,所以我们可以检查它是否保持“更长”的时间等等?
-
为什么必须一次将所有文件保存在内存中?如果您正在处理 csv,请重写您的代码,使其与生成器一起使用。然后流式传输 csv。
标签: python memory-management out-of-memory