2016-07-27 3 views
1

Я видел 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...") 
+0

Не используйте изменяемый объект в качестве параметра по умолчанию. См. Http://docs.python-guide.org/en/latest/writing/gotchas/ – cdarke

+0

Привет @cdarke спасибо за ваш ответ, пожалуйста, не могли бы вы объяснить, почему? причина, по которой я включил struc = {}, в случае, если я хотел, например, открыть 5 отдельных файлов и сохранить их все в отдельных ветвях одного и того же объекта. например x = {file1: {}, file2: {}} –

+0

Каждый вызов будет использовать тот же словарь. Вы прочитали ссылку, которую я дал? Пустой словарь '{}' создается как атрибут функции во время компиляции. Если вы вызвали функцию 28 раз по умолчанию, вы не получите 28 разных словарей, все они будут иметь один и тот же. По умолчанию это «Нет», затем проверьте его значение в теле функции. – cdarke

ответ

2

Каждый звонок будет использовать тот же словарь. См. http://docs.python-guide.org/en/latest/writing/gotchas/. Пустой словарь {} создается как атрибут функции во время компиляции.

Если вы вызвали функцию 28 раз по умолчанию, вы не получите 28 разных словарей, все они будут иметь один и тот же. По умолчанию это значение None, затем проверьте его значение в теле функции.

Попробуйте это:

def jsonify_csv(fileString, dimensions, metrics, struc = None): 
    if struc is None: 
     struc = {} 

    with open(fileString, 'rb') as f: 
    ... # and so on 
+0

Я исправил это сейчас, но все еще не уверен, почему один вызов функции дает мне объект, который использует так много памяти. –

Смежные вопросы