当前位置: 首页 > 面试题库 >

当使用Python处理巨大的CSV突然停止时,“杀死”是什么意思?

郭坚壁
2023-03-14
问题内容

我有一个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])

而且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版本,最终将把循环改回原来的样子。



 类似资料:
  • 我有一个Python脚本,它导入一个大的CSV文件,然后计算文件中每个单词的出现次数,然后将计数导出到另一个CSV文件。 但发生的是,一旦计数部分完成并开始导出,它就会在终端中显示。 我不认为这是一个内存问题(如果是的话,我假设我会得到一个内存错误,而不是被杀死)。 会不会是这个过程花的时间太长了?如果是的话,有没有办法延长暂停时间,这样我就可以避免这种情况? 代码如下: 在完成计数后,就会出现,

  • 我想知道如何有效地清理在飞行中创建的akka演员。 要提供一点背景信息: 每个事件创建的演员层次结构。 主管- 在我的应用程序中,主管参与者动态创建其他参与者(在定期事件上)。我想在该事件的处理步骤完成后清理参与者。 所以,一旦处理完成,我想杀死所有的儿童演员。 我在成功完成后以与创建相反的方式传播消息(successfulProcessing)。(1)- 这是主管演员的代码。 这是清理动态创建的

  • 我是android编程的新手,所以这些问题可能是愚蠢的。我读了一些书,但不能完全得到答案。 我有一个广播接收器,从一个服务注册了一些意图- 由于我移除了“setforeground”调用以保持我的服务运行(因为我不想要状态栏图标,我想知道我是否懒惰使用这种方法),我的服务现在将定期关闭,通常在短时间后再次启动(但有时我看到它是5分钟)。

  • 我有一个稍微令人困惑的问题,我认为由于一个愚蠢的疏忽,这将是一个容易解决的问题。 我的主要任务是上传图像和录音文件到我的服务器上的一个位置。我通过FTP这样做。 活动通过startService(intentName)调用服务 onHandleIntent()创建一个新线程 在新线程中,需要上传的文件被放入一个列表数组 在列表数组中循环。在这个循环中,将文件名传递给FTP服务器。如果添加成功,我会

  • 问题内容: 子进程开始于 有没有办法确保在父异常终止时将其杀死?我需要在Windows和Linux上都能使用。 编辑: 如果存在使用其他启动进程的方法的解决方案,则可以放宽启动子进程的要求。 问题答案: 呵呵,我昨天自己在研究这个!假设您无法更改子程序: 在Linux上,可能是唯一可靠的选择。(如果绝对有必要终止子进程,那么您可能希望将终止信号设置为SIGKILL而不是SIGTERM;链接到的代码

  • 本文向大家介绍暂停死区是什么?相关面试题,主要包含被问及暂停死区是什么?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 在代码块内,使用let、const命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”