繁体   English   中英

Python:进程已完成,退出代码为 137(被信号 9 中断:SIGKILL)

[英]Python: Process finished with exit code 137 (interrupted by signal 9: SIGKILL)

我在下面有一个脚本,用于检查我的 dataframe 中的一列地址与另一个 dataframe 中的一列地址的准确性,以查看它们是否匹配以及它们匹配的程度。

我的主要 dataframe 包含大约 300 万条记录 (business_rates.csv),参考 dataframe (all_food_hygiene_data_clean_up.csv) 包含大约 10,000 条记录。 我在处理比赛时收到此错误

错误:进程已完成,退出代码为 137(被信号 9 中断:SIGKILL)

我想是因为 memory 用完了。有人能告诉我如何解决退出代码 137 吗?

import pandas as pd
from rapidfuzz import process, fuzz
from itertools import islice

import time
from dask import dataframe as dd

ref_df = pd.read_csv('all_food_hygiene_data_clean_up.csv')
df = dd.read_csv('business_rates.csv', low_memory=False)

contacts_addresses = list(df.address)
ref_addresses = list(ref_df.ref_address.unique())
post_code = list(ref_df.post_code)


scores_list = []
names = []

start = time.time()
print("start time:", time.ctime(start))

chunk_size = 1000
ref_addr_iter = iter(ref_addresses)
while ref_addr_chunk := list(islice(ref_addr_iter, chunk_size)):

    scores = process.cdist(ref_addr_chunk, contacts_addresses, scorer=fuzz.token_sort_ratio, score_cutoff=0, workers=-1)
    max_scores_idx = scores.argmax(axis=1)

    print('post_code', len(post_code))
    print('max_scores_idx', len(max_scores_idx))

    for ref_addr_idx, score_idx in enumerate(max_scores_idx):
        names.append((ref_addr_chunk[ref_addr_idx], contacts_addresses[score_idx]))
        scores_list.append(scores[ref_addr_idx, score_idx])

end = time.time()
print("end time:", time.ctime(end))

name_dict = dict(names)

match_df = pd.DataFrame(name_dict.items(), columns=['ref_address', 'matched_address'])
scores_df = pd.DataFrame(scores_list)

merged_results_01 = pd.concat([match_df, scores_df], axis=1)
merged_results_01.to_csv('merged_results_01.csv')

merged_results_02 = pd.merge(ref_df, merged_results_01, how='right', on='ref_address')
merged_results_02.to_csv('results.csv', mode='a', index=False)


问题是您正在使用许多list()操作,这些操作试图在您传递的参数的 memory 中构造一个列表,在本例中是数百万条记录。 名单很贵。 这会导致内存不足的情况,并且操作系统会因此终止您的进程(信号 9)。 您需要重新设计您的算法,以“Pythonic”方式而不是使用列表来执行此操作。 我不确定你的算法是如何工作的,所以我不能更具体。 你比我更了解你的算法。 pandas访问数据的方式可能比列表更好; 我不熟悉pandas ,所以我无能为力。

我要注意的一件事是您应该更彻底地研究“迭代器”。 围绕islice()执行list() ) 会破坏islice() () 的目的。 Iterables 允许您以内存友好的方式处理数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM