我已经看到了与此类似的问题,但我认为我的困境在足以提出新问题的方式上是不同的。
我创建了一个函数,该函数可以打开一个csv文件,并根据维度和指标列表将数据聚合为类似json的字典结构。
问题是当我用它打开一个0.97GB的文件时,当我查看进程时,python进程正在使用大约1.02GB的内存。请记住,我只选择文件中一部分字段,并且数据是聚合的,因此我认为从本质上讲应该较小。另外,字典变量是从函数中返回的唯一内容,这不意味着它是函数运行后保留在内存中的唯一内容吗?有谁知道为什么我的字典对象占用这么多内存?
**编辑-这也是我的理解,csv.reader()是一个生成器,因此我什至没有一次加载整个文件,因此它一定只是使用所有内存的字典对象吗?
我在Windows上使用Python 2.7。
import json
import inspect
from pprint import pprint
import csv
from datetime import datetime
import sys
def jsonify_csv(fileString, dimensions, metrics, struc = {}):
with open(fileString, 'rb') as f:
reader=csv.reader(f)
headings = reader.next()
i = 0
for line in reader:
i+=1
row = {headings[i]:v for i, v in enumerate(line)}
pointer = struc
for dimension in dimensions:
if dimension == 'date':
val = str(datetime.strptime(row[dimension], "%d/%m/%Y").date().month)
else:
val = str(row[dimension])
pointer.setdefault(val, {})
pointer = pointer[val]
for metric in metrics:
pointer.setdefault(metric, 0.0)
try:
pointer[metric] += float(row[metric])
except ValueError:
pass
return struc
start = datetime.today()
dims = ['brand', 'source', 'affiliate', 'country', 'store', 'salesbundle', 'product', 'ordertype', 'returncode', 'supplier', 'category']
metrics = ['sales', 'qty', 'cogs', 'carriagereclaim', 'Carriage Charged Carrier', 'carriage_est', 'mktg_est', 'mktg_cost', 'royalty', 'finance', 'scrap_cost', 'mp_cost', 'budgetsales', 'budgetcosts', 'BSTD', 'budgetaftersales', 'budgetscrap', 'budgetcarriagerecovery', 'budgetcarriagepaid', 'budgetmetapack', 'budgetmarketing', 'budgetaffiliate', 'budgetoffline', 'budgetroyalty', 'budgetfinance', 'bundle_qty', 'misc_adjustments']
jsonified = jsonify_csv('PhocasSales_2015+.csv', dims, metrics)
print 'file opened', datetime.today()-start
stop = raw_input("waiting...")
每个呼叫将使用相同的字典。参见http://docs.python-guide.org/en/latest/writing/gotchas/。空字典{}
是在编译时作为函数的属性创建的。
如果使用默认值调用该函数28次,则不会获得28个不同的字典,它们将共享同一字典。将其默认设置为“无”,然后在函数主体中测试其值。
试试这个:
def jsonify_csv(fileString, dimensions, metrics, struc = None):
if struc is None:
struc = {}
with open(fileString, 'rb') as f:
... # and so on
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句