Я видел similar question, но я думаю, что мое затруднительное положение отличается в достаточном количестве, чтобы гарантировать новый вопрос.Почему словарь python использует столько памяти?
Я создал функцию, которая открывает файл csv и объединяет данные в json-подобную структуру словаря на основе списка измерений и показателей.
Проблема заключается в том, что я использую его для открытия файла с 0.97 ГБ, когда я смотрю в своих процессах, процесс python использует около 1.02 ГБ памяти. Принимая во внимание, что я выбираю только часть полей в файле, а данные агрегированы и там я думаю, что по своей природе он должен быть меньше. Также переменная словаря является единственной вещью, которая возвращается из функции, поэтому это не значит, что это единственное, что осталось в памяти после запуска этой функции? Кто-нибудь знает, почему мой словарь-объект использует столько памяти?
** EDIT - Также я понимаю, что csv.reader() является генератором, поэтому я даже не загружаю весь файл сразу, поэтому он должен просто быть объектом словаря, используя всю память?
Я использую Python 2.7 для Windows.
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/ – cdarke
Привет @cdarke спасибо за ваш ответ, пожалуйста, не могли бы вы объяснить, почему? причина, по которой я включил struc = {}, в случае, если я хотел, например, открыть 5 отдельных файлов и сохранить их все в отдельных ветвях одного и того же объекта. например x = {file1: {}, file2: {}} –
Каждый вызов будет использовать тот же словарь. Вы прочитали ссылку, которую я дал? Пустой словарь '{}' создается как атрибут функции во время компиляции. Если вы вызвали функцию 28 раз по умолчанию, вы не получите 28 разных словарей, все они будут иметь один и тот же. По умолчанию это «Нет», затем проверьте его значение в теле функции. – cdarke