Как эффективно анализировать большой список данных во время очистки с python? - PullRequest
0 голосов
/ 04 апреля 2020

В настоящее время я работаю над проектом очистки данных, который требует от меня загрузки и сохранения данных в каждом l oop. Вы можете спросить, почему я это сделал? Ну, прежде чем я очистил данные без загрузки и сохранения между каждыми l oop и потерял все мои данные, если скрипт потерпел крах в любом месте до последней итерации (что происходило каждый раз из-за тайм-аута, странного URL или чего-либо, что вы можете себе представить).

В целом метод, применяемый сейчас, работает нормально, но после примерно 20 000 итераций мои файлы хранения увеличиваются до длины ~ 90 МБ, в результате чего сценарий становится все медленнее и медленнее, что вынуждает меня создавать новый файл сохранения данных , Код ниже показывает основные функции моего скрипта.

import numpy as np

#List with URLS to scrape (220k URLS)
URLS = np.load("/some_directory/URLS.npy").tolist()

#Already checked URLS
Checked_URLS=np.load("/some_directory/checked_URLS.npy").tolist()

#Perform scraping and add new URL to checked list
for i in URLS:
    if i not in Checked_URLS:
        Checked_already.append(i)
        np.save("some_directory/checked_URLS.npy", Checked_already)
        NEW_DATA=Bunch_of_scraping_code

        #Load numpy list with data collected from previous URLS
        #Append new scraping data and save list
        FOUND_DATA=np.load("/some_directory/FOUND_DATA.npy", allow_pickle=True).tolist()
        FOUND_DATA.append(NEW_DATA)
        np.save("some_directory/FOUND_DATA.npy", LOT_DATA)

Я уверен, что должен быть еще способ pythoni c, при котором не требуется загружать все списки в python каждый l oop? Или, возможно, другой способ, который не требует написания вообще? Я записываю свои списки в .npy, потому что, насколько мне известно, это самый эффективный способ разбора файлов больших списков.

Я пытался сохранить свои данные непосредственно в pandas, но это сделало все намного хуже и медленнее. Вся помощь будет оценена!

1 Ответ

0 голосов
/ 04 апреля 2020

Я думаю, что гораздо более эффективным подходом было бы обернуть код, который может обработать sh, с помощью try/except и записать проблемные URL c для дальнейшего изучения вместо того, чтобы повторять одни и те же операции снова и снова:

for url in URLS:
    try:
        FOUND_DATA=np.load("/some_directory/FOUND_DATA.npy", allow_pickle=True).tolist()
        FOUND_DATA.append(NEW_DATA)
    except Exception as ex:
        # for any reason the code crashes, the following message will be printed and the loop will continue
        print(f"Failed to process url: {url})
...