“杀”是什么意思?
我有一个Python脚本,导入一个大的CSV文件,然后统计文件中每个单词的出现次数,然后将计数导出到另一个CSV文件。
但是,发生的事情是,一旦计数部分完成,出口开始说, Killed
在terminal。
我不认为这是一个内存问题(如果这是我认为我会得到一个内存错误,而不是被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])
Killed
finished counting
发生打印finished counting
后,完整的信息是:
killed (program exited with code: 137)
退出代码137(128 + 9)表示您的程序由于接收到信号9( SIGKILL
而退出。 这也解释了killed
消息。 问题是,你为什么收到这个信号?
最可能的原因可能是您的stream程超出了您允许使用的系统资源的数量限制。 根据您的操作系统和configuration,这可能意味着您有太多打开的文件,使用太多的文件空间或其他东西。 最有可能的是你的程序使用了太多的内存。 当内存分配开始失败时,系统并不会冒险破坏系统,而是向使用太多内存的进程发送kill信号。
正如我之前所说的,打印finished counting
后可能会遇到内存限制的一个原因是,在最后一个循环中调用counter.items()
分配一个列表,其中包含字典中的所有键和值。 如果你的字典有大量的数据,这可能是一个非常大的名单。 一个可能的解决scheme是使用counter.iteritems()
这是一个发生器。 而不是返回列表中的所有项目,它可以让你迭代他们更less的内存使用量。
所以,我build议尝试这个,作为你的最后一个循环:
for key, value in counter.iteritems(): writer.writerow([key, value])
请注意,在Python 3中, items
返回一个“字典视图”对象,它与Python 2的版本没有相同的开销。 它取代了iteritems
,所以如果你以后升级了Python版本,你最终会把循环改回原来的样子。
有两个存储区域:堆栈和堆栈。堆栈是当前保存方法调用状态的地方(即局部variables和引用),堆是存储对象的地方。 recursion和记忆
我觉得在counter
dict中有太多的键会占用堆区的太多内存,所以Python运行时会引发一个OutOfMemoryexception。
为了保存它,不要创build一个巨大的物体,例如柜台 。
1.StackOverflow
一个创build太多局部variables的程序。
Python 2.7.9 (default, Mar 1 2015, 12:57:24) [GCC 4.9.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> f = open('stack_overflow.py','w') >>> f.write('def foo():\n') >>> for x in xrange(10000000): ... f.write('\tx%d = %d\n' % (x, x)) ... >>> f.write('foo()') >>> f.close() >>> execfile('stack_overflow.py') Killed
2.OutOfMemory
创build一个巨大的dict
包括太多的密钥的程序。
>>> f = open('out_of_memory.py','w') >>> f.write('def foo():\n') >>> f.write('\tcounter = {}\n') >>> for x in xrange(10000000): ... f.write('counter[%d] = %d\n' % (x, x)) ... >>> f.write('foo()\n') >>> f.close() >>> execfile('out_of_memory.py') Killed
参考
- 7.内存:堆栈vs堆
- recursion和记忆
我怀疑有什么东西正在杀死这个过程,因为这需要很长时间。 通常意义上的杀死意味着外部的东西终止了这个过程,但在这种情况下可能不会触及Ctrl-C,因为这会导致Python退出KeyboardInterruptexception。 另外,在Python中,如果出现这个问题,你会得到MemoryErrorexception。 可能发生的是你正在碰到Python或标准库代码中的一个错误,导致进程崩溃。