Как предотвратить сбой spyder, если в списке слишком много данных?

Я запускаю приведенный ниже код для получения объектов XML из API в Anaconda Spyder. Объекты XML, добавленные в список, продолжают увеличиваться. По какой-то причине spyder продолжает давать сбой, насколько я понимаю, список становится все большим.

Мне нужно сделать примерно ~ 300K вызовов api, для которых мне нужны данные, которые, как мне кажется, вызывают сбой моего приложения, потому что, когда я добавляю в список, данных слишком много.

Ниже приведен код для вызова API и сохранения результатов в список. lst1 - это список идентификаторов, которые я передаю в api. Я должен принять во внимание, что если время HTTP-запроса истекает или я могу создать механизм для очистки добавленного списка данных, я могу перезапустить запросы с идентификатора, на котором я остановился, из lst1, который передается в URL-адрес api.

import requests
import pandas as pd
import xml.etree.ElementTree as ET
from bs4 import BeautifulSoup 
import time
from concurrent import futures

lst1=[1,2,3]

lst =[]

for i in lst1:
    url = 'urlId={}'.format(i)
    while True:
        try:
            xml_data1 = requests.get(url).text
            print(xml_data1)
            break
        except requests.exceptions.RequestException as e:
            print(e)
    lst.append(xml_data1)

Я думаю, что если я могу применить свою функцию ниже, чтобы распаковать xml в фрейм данных и выполнить необходимые манипуляции с фреймом данных, очищая список добавленных данных lst, это может освободить память. ЕСЛИ это не так, я открыт для любых предложений, позволяющих избежать сбоев кода или приложения из-за того, что я считаю слишком большим количеством XML-данных в списке:

def create_dataframe(xml):
    soup = BeautifulSoup(xml, "xml")
    # Get Attributes from all nodes
    attrs = []
    for elm in soup():  # soup() is equivalent to soup.find_all()
        attrs.append(elm.attrs)
    # Since you want the data in a dataframe, it makes sense for each field to be a new row consisting of all the other node attributes
    fields_attribute_list = [x for x in attrs if 'Id' in x.keys()]
    other_attribute_list = [x for x in attrs if 'Id' not in x.keys() and x != {}]
    # Make a single dictionary with the attributes of all nodes except for the `Field` nodes.
    attribute_dict = {}
    for d in other_attribute_list:
        for k, v in d.items():
            attribute_dict.setdefault(k, v)
    # Update each field row with attributes from all other nodes.
    full_list = []
    for field in fields_attribute_list:
        field.update(attribute_dict)
        full_list.append(field)
    # Make Dataframe
    df = pd.DataFrame(full_list)
    return df


with futures.ThreadPoolExecutor() as executor:  # Or use ProcessPoolExecutor
    df_list = executor.map(create_dataframe, lst)

full_df = pd.concat(df_list)
print(full_df)


#final pivoted dataframe
final_df = pd.pivot_table(full_df, index='Id', columns='FieldTitle', values='Value', aggfunc='first').reset_index()

(Сопровождающий Spyder здесь) Трудно помочь вам, не имея возможности запускать этот код самостоятельно, но (как вы сказали) вам должно быть лучше, обрабатывая каждый ответ xml после того, как он поступает, вместо того, чтобы добавлять их все в список и продолжать. Вы даже можете сделать это асинхронно, потому что кажется, что обработка каждого ответа не зависит от других. Для этого (я думаю) вы могли бы использовать Сумки Dask.

Carlos Cordoba 13.09.2018 23:03

@CarlosCordoba, спасибо за предложение. В любом случае вы можете дать мне пример обработки xml после того, как они прибудут с кодом, который у меня есть? Я проверю пакеты для посуды

RustyShackleford 13.09.2018 23:12

Извините, у меня больше нет советов.

Carlos Cordoba 14.09.2018 03:18
0
3
399
0

Другие вопросы по теме