CSV-файл перемещается с 316 КБ до ~ 3 ГБ во время выполнения приложения django, а затем мгновенно возвращается обратно после завершения работы приложения - PullRequest
0 голосов
/ 02 июля 2019

Объяснение немного длинное, но большая часть этого заключается в том, чтобы дать некоторое представление о моей проблеме (проблема, вероятно, не связана с Python, но наличие дополнительной информации не повредит):

В настоящее время я работаю над приложением django.Окно приложения (браузер) имеет два фрейма, каждый из которых занимает 50% экрана.С левой стороны будут отображаться страницы snopes (веб-сайт проверки фактов), а с правой стороны будет отображаться одна из страниц, связанных в этой статье о snopes.

Форма в нижней части приложения позволит пользователю выбрать и опубликовать, является ли страница RHS источником заявки в статье об отслеживании или нет (есть также «неверный ввод» или «Я не знаю»).«).

Отправка вызывает функцию, которая пытается получить другие ссылки на текущей странице фрагментов, и, если ее нет, получить аннотации любых страниц (в этом приоритете) дважды, один раз или как минимум (поэтому 0, затем 3, затем4 .....).Это делается с помощью count.csv, в котором просто хранится количество аннотированных комбинаций каждой страницы + ссылки (как могут повторяться статьи-фрагменты, так и ссылки на сайты).

Заголовок count.csv:

page source_url count

Страницы, которые должны отображаться с обеих сторон, извлекаются из CSV со следующим заголовком:

page claim verdict tags date author source_list source_url

И пользовательский ввод сохраняется в отдельном CSV для каждого пользователя внутриresults каталог с заголовком:

page claim verdict tags date author source_list source_url value name

При значении 1 (да), 2 (нет), 3 (неверный ввод), 4 (не знаю)

HTML-кодвсе ссылки в первом csv (называемом samples.csv) извлекаются заранее и сохраняются с использованием имени статьи в качестве имени каталога.Сама страница хранится как «page.html», а источники - как «some_number.html», где some_number - это индекс источника в source_list.

Например, html первой ссылки в статье фрагментов под названием «is-water-wet» будет

Annotator/annotator/data/html_snopes/is-water-wet/0.html

manage.py находится в Annotator

После получения строки из примеров (файл данных pandas, созданный с использованием samples.csv).мое приложение Django получает все строки с одной и той же страницы и автоматически аннотирует строки без соответствующего пути как 3 (неверный ввод), поскольку это означает, что получение html не удалось.

Когда я запустил приложение навиртуальная машина, я заметил серьезную проблему.Когда я вхожу (в приложение) с пользователем и комментирую, соответствующий results csv по какой-то причине переходит с 316kb на ~ 3gb и обратно после завершения работы приложения, даже если csv имеет только около 248 строк.

Я проверил первые несколько строк (из результатов CSV), и они выглядят совершенно нормально.

Вот код:

def get_done_by_annotator(name):
    # creates a list of pages that have been already annotated by the current annotator
    results_filename = results_path+name+".csv"
    if os.path.exists(results_filename):
        results = pd.read_csv(results_filename, sep=',', encoding="latin1")
        done_by_annotator = (results["page"]+results["source_url"]).unique()
    else:
        done_by_annotator = []
    return done_by_annotator
def get_count_file(s_p):
    #Creates or reads countfile:
    if os.path.exists(count_path):
        count_file = pd.read_csv(count_path, sep=',', encoding="latin1").sample(frac=1)
    else:
        count_file = s_p[['page','source_url']].copy()
        count_file['count'] = 0
        count_file.to_csv(count_path, sep=',', index=False)
    return count_file
def increase_page_annotation_count(page, origin):
    count_file = pd.read_csv(count_path, sep=',', encoding="latin1")
    count_file.loc[(count_file['page'] == page) & (count_file['source_url'] == origin), 'count'] += 1
    count_file.to_csv(count_path, sep=',', index=False)
def save_annotation(page, origin, value, name):
    # Read samples file
    print("SAVING ANNOTATION")
    s_p = pd.read_csv(samples_path, sep='\t', encoding="latin1")
    entry = s_p.loc[(s_p["page"] == page) & (s_p["source_url"] == origin)]
    if not (entry.empty):
        n_entry = entry.values.tolist()[0]
        n_entry.extend([value, name])
        results_filename = results_path+name+".csv"
        if os.path.exists(results_filename):
            results = pd.read_csv(results_filename, sep=',', encoding="latin1")
        else:
            results = pd.DataFrame(columns=res_header)
        oldEntry = results.loc[(results["page"] == page) & (results["source_url"] == origin)]
        if oldEntry.empty:
            results.loc[len(results)] = n_entry
        results.to_csv(results_filename, sep=',', index=False)
        # keeps track of how many times page was annotated
        increase_page_annotation_count(page, origin)
def get_least_annotated_page(name,aPage=None):
    done_by_annotator = get_done_by_annotator(name)

    #Print number of annotated pages and total number of pages
    s_p = pd.read_csv(samples_path, sep='\t', encoding="latin1")
    print("done: ", len(done_by_annotator), " | total: ", len(s_p))

    if len(done_by_annotator) == len(s_p):
        return "Last annotation done! Thank you!", None, None, None, None, None, None, None

    #Creates or reads countfile:
    count_file = get_count_file(s_p)

    #Get pages not done by current annotator
    not_done_count = count_file.loc[~(count_file['page']+count_file['source_url']).isin(done_by_annotator)]


    print(">>",aPage)
    if aPage is not None:
        remOrigins = not_done_count.loc[not_done_count['page'] == aPage]
        if len(remOrigins)==0:
            return get_least_annotated_page(name)
    else:
        twice_annotated = not_done_count.loc[not_done_count['count'] == 2]
        if len(twice_annotated) > 0:
            page = twice_annotated.iloc[0]['page']
        else:    
            once_annotated = not_done_count.loc[not_done_count['count'] == 1]
            if len(once_annotated) > 0:
                page = once_annotated.iloc[0]['page']
            else:
                index = not_done_count['count'].idxmin(axis=0, skipna=True)
                page = not_done_count.loc[index]['page']
        remOrigins = not_done_count.loc[not_done_count['page'] == page]

    page = remOrigins.iloc[0].page
    #Automatically annotate broken links of this page as invalid input (op = 3)
    src_lst = s_p.loc[s_p['page'] == page]
    src_lst = ast.literal_eval(src_lst.iloc[0].source_list)
    for idx, e in remOrigins.iterrows():
        src_idx_num = src_lst.index(e.source_url)
        if not (os.path.exists(snopes_path+(e.page.strip("/").split("/")[-1]+"/")+str(src_idx_num)+".html")):
            save_annotation(e.page, e.source_url, "3", name)

    #Update done_by_annotator, count_file, and not_done_count
    done_by_annotator = get_done_by_annotator(name)
    count_file = get_count_file(s_p)
    not_done_count = count_file.loc[~(count_file['page']+count_file['source_url']).isin(done_by_annotator)]

    remOrigins = not_done_count.loc[not_done_count['page'] == page]
    if len(remOrigins)==0:
        return get_least_annotated_page(name)

    entry = remOrigins.iloc[0]
    entry = s_p[(s_p.page.isin([entry.page]) & s_p.source_url.isin([entry.source_url]))].iloc[0]
    a_page = entry.page.strip()
    o_page = entry.source_url.strip()
    src_lst = entry.source_list.strip()

    a_page_path = a_page.strip("/").split("/")[-1]+"/"
    src_idx_num = src_lst.index(o_page)
    o_page_path = a_page_path+str(src_idx_num)+".html"

    f = codecs.open(snopes_path+a_page_path+"page.html", encoding='utf-8')
    a_html = bs(f.read(),"lxml")
    f = codecs.open(snopes_path+o_page_path, encoding='utf-8')
    o_html = bs(f.read(),"lxml")

    return a_page, o_page, str(a_html), str(o_html), src_lst, a_done, a_total, len(done_by_annotator)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...