2016-07-28 3 views
1

У меня есть следующая программа. В то время как я бегу, я получил Memory Error, в частности, в Fpred = F.predict(A) (смотрите ниже)У Python заканчивается память

import json 
data = [] 
with open('yelp_data.json') as f: 
    for line in f: 
     data.append(json.loads(line)) 
star = [] 
for i in range(len(data)): 
    star.append(data[i].values()[10]) 

attributes = [] 
for i in range(len(data)): 
    attributes.append(data[i].values()[12]) 


def flatten_dict(dd, separator=' ', prefix=''): 
    return { prefix + separator + k if prefix else k : v 
     for kk, vv in dd.items() 
     for k, v in flatten_dict(vv, separator, kk).items() 
     } if isinstance(dd, dict) else { prefix : dd } 

flatten_attr = list(flatten_dict(attributes[i], separator = ' ', prefix = '') for i in range(len(attributes))) 


from sklearn.feature_extraction import DictVectorizer 
v = DictVectorizer(sparse = False) 
X = v.fit_transform(flatten_attr) 

from sklearn.feature_extraction.text import TfidfTransformer 
Transformer = TfidfTransformer() 
A = Transformer.fit_transform(X) 

from sklearn.linear_model import LinearRegression 
from sklearn.cross_validation import train_test_split 

from sklearn.neighbors import KNeighborsRegressor 
from sklearn.cross_validation import KFold 

F = KNeighborsRegressor(n_neighbors = 27) 

Ffit = F.fit(A, star) 
Fpred = F.predict(A) 
Score = F.score(A, star) 
print(Score) 

Мой файл JSON выглядит так -

{"business_id": "vcNAWiLM4dR7D2nwwJ7nCA", "full_address": "4840 E Indian School Rd\nSte 101\nPhoenix, AZ 85018", "hours": {"Tuesday": {"close": "17:00", "open": "08:00"}, "Friday": {"close": "17:00", "open": "08:00"}, "Monday": {"close": "17:00", "open": "08:00"}, "Wednesday": {"close": "17:00", "open": "08:00"}, "Thursday": {"close": "17:00", "open": "08:00"}}, "open": true, "categories": ["Doctors", "Health & Medical"], "city": "Phoenix", "review_count": 7, "name": "Eric Goldberg, MD", "neighborhoods": [], "longitude": -111.98375799999999, "state": "AZ", "stars": 3.5, "latitude": 33.499313000000001, "attributes": {"By Appointment Only": true}, "type": "business"} 
{"business_id": "JwUE5GmEO-sH1FuwJgKBlQ", "full_address": "6162 US Highway 51\nDe Forest, WI 53532", "hours": {}, "open": true, "categories": ["Restaurants"], "city": "De Forest", "review_count": 26, "name": "Pine Cone Restaurant", "neighborhoods": [], "longitude": -89.335843999999994, "state": "WI", "stars": 4.0, "latitude": 43.238892999999997, "attributes": {"Take-out": true, "Good For": {"dessert": false, "latenight": false, "lunch": true, "dinner": false, "breakfast": false, "brunch": false}, "Caters": false, "Noise Level": "average", "Takes Reservations": false, "Delivery": false, "Ambience": {"romantic": false, "intimate": false, "touristy": false, "hipster": false, "divey": false, "classy": false, "trendy": false, "upscale": false, "casual": false}, "Parking": {"garage": false, "street": false, "validated": false, "lot": true, "valet": false}, "Has TV": true, "Outdoor Seating": false, "Attire": "casual", "Alcohol": "none", "Waiter Service": true, "Accepts Credit Cards": true, "Good for Kids": true, "Good For Groups": true, "Price Range": 1}, "type": "business"} 

$ls -l yelp_data.json 

показывает размер файла 33524921

Чем хуже Я мог бы сделать это, чтобы извлечь необходимые данные в другой файл и импортировать его в эту программу? Что было бы полезно улучшить эту программу, чтобы она работала более эффективно? Спасибо!! связанный

+0

Это мусор, который трудно читать. вам лучше дать некоторые комментарии и насколько большой ваш 'yelp_data.json', какой формат каждой строки в json-файле. –

+0

Спасибо. Я это делаю. – achimneyswallow

+0

Ваш код выглядит так: python - это не ваш обычный язык, но я не думаю, что это проблема. Вы можете пометить вопрос с помощью sklearn, поскольку, по моему мнению, эта функция может использовать много памяти. Если вы можете использовать генераторы вместо списков, вы не будете есть память. Возможно, вам захочется удалить промежуточные списки, если они вам больше не нужны. –

ответ

0

Не производительность/памяти, но вы можете заменить:

for i in range(len(data)): 
    star.append(data[i].values()[10]) 

по:

for item in data: 
    star.append(item.values()[10]) 

data будучи list, это итерация. https://docs.python.org/3/library/stdtypes.html#list

Также в Python 3, значение индексации Dict больше не работает, вы будете в конечном итоге с:

star.append(data[i].values()[10]) 
TypeError: 'dict_values' object does not support indexing 

Поскольку элементы в data является JSON dicts, вы можете искать для атрибутов по имени вместо того, чтобы полагаться по индексу атрибута:

for item in data: 
    star.append(item['thekeyyourelookingfor']) 

а затем сделать его однострочный:

star = [item['thekeyyourelookingfor'] for item in data] 

EDIT: на самом деле, поскольку json.loads читает строку JSON в словаре, порядок или атрибуты произвольны, поэтому при доступе к ним по индексу вы, скорее всего, получите другой атрибут, отличный от того, который вы ищете. Здесь вы хотите прочитать stars Я думаю. Я даже догадываюсь, почему ваш код не работает, поскольку вы даете вкладку sklearn, которого он не ожидает.

+0

Спасибо. Для меня всегда есть что-то новое. – achimneyswallow

+0

Попробуйте: 'star = [item.get ('stars') для элемента в данных]' и 'attributes = [item.get ('attributes') для элемента в данных]' и см. Мой EDIT выше. – Guillaume

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