我有一个 Python 脚本,它导入一个大型 CSV 文件,然后计算文件中每个单词的出现次数,然后将计数导出到另一个 CSV 文件。
但正在发生的事情是,一旦计数部分完成并开始导出,它就会说Killed
在终端中。
我不认为这是一个内存问题(如果是的话,我认为我会遇到内存错误,而不是Killed
).
会不会是这个过程花费的时间太长了?如果是这样,有没有办法延长超时时间以避免这种情况?
这是代码:
csv.field_size_limit(sys.maxsize)
counter={}
with open("/home/alex/Documents/version2/cooccur_list.csv",'rb') as file_name:
reader=csv.reader(file_name)
for row in reader:
if len(row)>1:
pair=row[0]+' '+row[1]
if pair in counter:
counter[pair]+=1
else:
counter[pair]=1
print 'finished counting'
writer = csv.writer(open('/home/alex/Documents/version2/dict.csv', 'wb'))
for key, value in counter.items():
writer.writerow([key, value])
And the Killed
发生在之后finished counting
已打印,完整消息为:
killed (program exited with code: 137)
退出代码137(128+9)表示你的程序由于接收到信号9而退出,即SIGKILL
。这也解释了killed
信息。问题是,为什么你会收到这个信号?
最可能的原因可能是您的进程超出了允许您使用的系统资源量的某些限制。根据您的操作系统和配置,这可能意味着您打开了太多文件,使用了太多文件系统空间或其他原因。最有可能的是您的程序使用了太多内存。当内存分配开始失败时,系统不会冒着崩溃的风险,而是向使用过多内存的进程发送终止信号。
正如我之前评论的,打印后可能会达到内存限制的原因之一finished counting
这是你的电话吗counter.items()
在最后的循环中分配一个包含字典中所有键和值的列表。如果您的字典有大量数据,这可能是一个非常大的列表。一个可能的解决方案是使用counter.iteritems()
这是一个发电机。它不是返回列表中的所有项目,而是让您以更少的内存使用量迭代它们。
所以,我建议尝试这个,作为你的最后一个循环:
for key, value in counter.iteritems():
writer.writerow([key, value])
请注意,在 Python 3 中,items
返回一个“字典视图”对象,它的开销与 Python 2 的版本不同。它取代了iteritems
,因此如果您以后升级 Python 版本,您最终会将循环更改回原来的方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)