我有一个Python脚本,它导入一个大的CSV文件,然后计算文件中每个单词的出现次数,然后将计数导出到另一个CSV文件。
但发生的是,一旦计数部分完成并开始导出,它就会在终端中显示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])
在完成计数后,就会出现Kill
,完整的消息是:
killed (program exited with code: 137)
最可能的情况是,内存耗尽,因此内核终止了进程。
你听说过OOM杀手吗?
以下是我为处理CSV文件中的大量数据而开发的脚本的日志:
Mar 12 18:20:38 server.com kernel: [63802.396693] Out of memory: Kill process 12216 (python3) score 915 or sacrifice child
Mar 12 18:20:38 server.com kernel: [63802.402542] Killed process 12216 (python3) total-vm:9695784kB, anon-rss:7623168kB, file-rss:4kB, shmem-rss:0kB
Mar 12 18:20:38 server.com kernel: [63803.002121] oom_reaper: reaped process 12216 (python3), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
它取自/var/log/syslog
。
基本上:
PID 12216被选为受害者(因为它使用了9Gb的总vm),所以oom_killer获得了它。
这是一篇关于OOM行为的文章。
涉及到两个存储区域:堆栈和堆。栈是保存方法调用的当前状态(即局部变量和引用)的地方,堆是存储对象的地方。递归和内存
我发现计数器
中有太多的键会消耗堆区域的太多内存,所以Python运行时会引发OutOfMemory异常。
要保存它,请不要创建巨大的对象,例如计数器。
1.堆栈溢出
创建过多局部变量的程序。
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
一个程序,创建一个巨大的代码包括太多的关键字。
>>> 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
退出代码137(128 9)表示您的程序由于接收到信号9而退出,信号9是SIGKILL
。这也解释了killed
消息。问题是,你为什么会收到这个信号?
最可能的原因可能是您的进程超出了允许使用的系统资源量的某些限制。根据您的操作系统和配置,这可能意味着您有太多打开的文件,使用了太多的文件系统空间或其他东西。最可能的情况是您的程序使用了太多内存。当内存分配开始失败时,系统向使用过多内存的进程发送一个终止信号,而不是冒着崩溃的风险。
正如我前面所评论的,在打印完成计数后可能会达到内存限制的一个原因是,在最后一个循环中,对
counter.items()
的调用分配了一个包含字典中所有键和值的列表。如果你的字典有很多数据,这可能是一个非常大的列表。一个可能的解决方案是使用counter.iteritems()
这是一个生成器。它不返回列表中的所有项目,而是让您以更少的内存使用量对它们进行迭代。
所以,我建议试试这个,作为你的最后一个循环:
for key, value in counter.iteritems():
writer.writerow([key, value])
请注意,在Python3中,
items
返回一个“dictionary view”对象,该对象的开销与Python2的版本不同。它取代了iteritems
,因此如果以后升级Python版本,最终会将循环更改回原来的方式。
问题内容: 我有一个Python脚本,该脚本导入一个大型CSV文件,然后计算该文件中每个单词的出现次数,然后将计数导出到另一个CSV文件。 但是发生的是,一旦计数部分完成并开始输出,它就会在终端上说。 我不认为这是内存问题(如果是的话,我认为我会遇到内存错误而不是)。 可能是这个过程花了太长时间吗?如果是这样,有没有办法延长超时期限,这样我可以避免这种情况? 这是代码: 而且发生后已打印,以及完整
我想知道如何有效地清理在飞行中创建的akka演员。 要提供一点背景信息: 每个事件创建的演员层次结构。 主管- 在我的应用程序中,主管参与者动态创建其他参与者(在定期事件上)。我想在该事件的处理步骤完成后清理参与者。 所以,一旦处理完成,我想杀死所有的儿童演员。 我在成功完成后以与创建相反的方式传播消息(successfulProcessing)。(1)- 这是主管演员的代码。 这是清理动态创建的
我是android编程的新手,所以这些问题可能是愚蠢的。我读了一些书,但不能完全得到答案。 我有一个广播接收器,从一个服务注册了一些意图- 由于我移除了“setforeground”调用以保持我的服务运行(因为我不想要状态栏图标,我想知道我是否懒惰使用这种方法),我的服务现在将定期关闭,通常在短时间后再次启动(但有时我看到它是5分钟)。
我有一个稍微令人困惑的问题,我认为由于一个愚蠢的疏忽,这将是一个容易解决的问题。 我的主要任务是上传图像和录音文件到我的服务器上的一个位置。我通过FTP这样做。 活动通过startService(intentName)调用服务 onHandleIntent()创建一个新线程 在新线程中,需要上传的文件被放入一个列表数组 在列表数组中循环。在这个循环中,将文件名传递给FTP服务器。如果添加成功,我会
我的问题是: > 如何使其与较大的文件一起工作? 有什么办法能让它快一点吗? 我的电脑有8GB的RAM,运行64位Windows 7,处理器是3.40GHz(不确定你需要什么信息)。
问题内容: 我的应用程序在Linux上作为后台进程运行。当前在“终端”窗口的命令行中启动。 最近,一个用户执行该应用程序一段时间后,它神秘地死了。文本: 被杀 在航站楼上。这发生了两次。我问其他终端是否有人使用kill命令杀死进程?没有。 Linux在什么情况下会决定终止我的进程?我相信外壳程序显示为“ killed”,因为该进程在收到kill(9)信号后就死了。如果Linux发送了kill信号,