Это первый раз, когда я так сильно разбираюсь в Python, поэтому мне нужна помощь.Оптимизация циклов с большими наборами данных Python
У меня есть MongoDB (или питона Dict) со следующей структурой:
{
"_id": { "$oid" : "521b1fabc36b440cbe3a6009" },
"country": "Brazil",
"id": "96371952",
"latitude": -23.815124482000001649,
"longitude": -45.532670811999999216,
"name": "coffee",
"users": [
{
"id": 277659258,
"photos": [
{
"created_time": 1376857433,
"photo_id": "525440696606428630_277659258",
},
{
"created_time": 1377483144,
"photo_id": "530689541585769912_10733844",
}
],
"username": "foo"
},
{
"id": 232745390,
"photos": [
{
"created_time": 1369422344,
"photo_id": "463070647967686017_232745390",
}
],
"username": "bar"
}
]
}
Теперь я хочу, чтобы создать два файла, один с резюме, а другой с весом каждого соединения. Мой цикл, который работает для небольших наборов данных заключается в следующем:
#a is the dataset
data = db.collection.find()
a =[i for i in data]
#here go the connections between the locations
edges = csv.writer(open("edges.csv", "wb"))
#and here the location data
nodes = csv.writer(open("nodes.csv", "wb"))
for i in a:
#find the users that match
for q in a:
if i['_id'] <> q['_id'] and q.get('users') :
weight = 0
for user_i in i['users']:
for user_q in q['users']:
if user_i['id'] == user_q['id']:
weight +=1
if weight>0:
edges.writerow([ i['id'], q['id'], weight])
#find the number of photos
photos_number =0
for p in i['users']:
photos_number += len(p['photos'])
nodes.writerow([ i['id'],
i['name'],
i['latitude'],
i['longitude'],
len(i['users']),
photos_number
])
скейлинговых проблемы: У меня есть 20000 мест, каждое место может иметь до 2000 пользователей, каждый пользователь может иметь около 10 фотографий.
Есть ли более эффективный способ создания вышеуказанных циклов? Может быть, Multithreads, JIT, больше индексов? Потому что, если я запустил выше в одной нити, можно получить до 20000^2 * 2000 * 10 результатов ...
Так как же я могу более эффективно справиться с вышеуказанной проблемой? Благодаря
Изменение стиля: замените '<>' на '! ='. Кроме того, что находится в 'a'? – Tadeck
'a' означает dict. Я обновил свой вопрос. – Diolor
Я не думаю, что это означает дикта. В противном случае 'for i in a' будет итерировать по _keys_, поэтому дальнейшее использование ключа' i ['_ id'] 'приведет к возникновению ошибки. Полагаю, это список. – Tadeck