2015-12-14 65 views
3

我正在运行一直为我工作的代码。这次我在2个.csv文件上运行它:“data”(24 MB)和“data1”(475 MB)。 “数据”每列有大约680000个元素的3列,而“data1”有3列,每列33000000个元素。当我运行代码时,经过大约5分钟的处理之后,我得到了“Killed:9”。如果这是一个内存问题,如何解决它?任何建议是值得欢迎的!Python Killed:9使用从2 csv文件创建的字典运行代码时

这是代码:

import csv 
import numpy as np 

from collections import OrderedDict # to save keys order 

from numpy import genfromtxt 
my_data = genfromtxt('data.csv', dtype='S', 
       delimiter=',', skip_header=1) 
my_data1 = genfromtxt('data1.csv', dtype='S', 
       delimiter=',', skip_header=1) 

d= OrderedDict((rows[2],rows[1]) for rows in my_data) 
d1= dict((rows[0],rows[1]) for rows in my_data1) 

dset = set(d) # returns keys 
d1set = set(d1) 

d_match = dset.intersection(d1) # returns matched keys 

import sys 
sys.stdout = open("rs_pos_ref_alt.csv", "w") 

for row in my_data: 
    if row[2] in d_match: 
     print [row[1], row[2]] 

的 “数据” 标题是:

dbSNP RS ID Physical Position 
0 rs4147951 66943738 
1 rs2022235 14326088 
2 rs6425720 31709555 
3 rs12997193 106584554 
4 rs9933410 82323721 
5 rs7142489 35532970 

的 “数据1” 标题是:

V2 V4 V5 
10468 TC T 
10491 CC C 
10518 TG T 
10532 AG A 
10582 TG T 
+1

你是在自己的计算机上还是在某台服务器上运行它?如果它运行在服务器上,可能有一些脚本监视“流氓”的进程,在一段时间后调用'kill -9'。 –

+0

嗨@tobias_k,我在自己的笔记本电脑上运行它 – Lucas

+0

在标准输出中,或者在一个异常信息中,你如何获得“杀死:9”? –

回答

5

最有可能的内核杀死它。 您需要采取不同的方法并尽量减少内存中数据的大小。

您也可以找到这个问题的有用:Very large matrices using Python and NumPy

在下面的代码片段我试图避免处理它行由行装载巨大data1.csv到内存中。试一试。

import csv 

from collections import OrderedDict # to save keys order 

with open('data.csv', 'rb') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',') 
    next(reader) #skip header 
    d = OrderedDict((rows[2], {"val": rows[1], "flag": False}) for rows in reader) 

with open('data1.csv', 'rb') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',') 
    next(reader) #skip header 
    for rows in reader: 
     if rows[0] in d: 
      d[rows[0]]["flag"] = True 

import sys 
sys.stdout = open("rs_pos_ref_alt.csv", "w") 

for k, v in d.iteritems(): 
    if v["flag"]: 
     print [v["val"], k] 
1

首先,创建一个python脚本并运行以下代码来查找所有Python进程。

import subprocess 

wmic_cmd = """wmic process where "name='python.exe' or name='pythonw.exe'" get commandline,processid""" 
wmic_prc = subprocess.Popen(wmic_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 
wmic_out, wmic_err = wmic_prc.communicate() 
pythons = [item.rsplit(None, 1) for item in wmic_out.splitlines() if item][1:] 
pythons = [[cmdline, int(pid)] for [cmdline, pid] in pythons] 
for line in pythons: 
    cv = str(line).split('\\') 
    cb=str(cv).strip('"') 
    fin = cv[-1] 
    if fin[0:11] != 'pythonw.exe': 
     print 'pythonw.exe', fin 
    if fin[0:11] != 'python.exe': 
     print "'python.exe'", fin 

运行后,粘贴输出,在这里的问题部分,我会看到通知。

*编辑

列出所有的进程,并在你的答案张贴,使用以下命令:因为你的脚本消耗了太多的内存

import psutil 
for process in psutil.process_iter(): 
    print process 
+0

谢谢@ajsp,我运行你的代码,但是我没有看到任何输出,至少不是在终端中。脚本似乎运行良好虽然 – Lucas

+0

有一个进程在某处运行-9 kill,如果你发现它已经找到了你的罪魁祸首,你最近是否在处理任何其他代码?你是否在脚本的某个地方写了一个脚本来杀死一个PID号码? – ajsp

+0

请参阅编辑和回到我身边 – ajsp

1

您的计算机有多少内存?

您可以添加一些优化来节省一些内存,如果这还不够,您可以权衡一些CPU和IO以提高内存效率。

如果你只比较关键,不要做任何事情的价值观,你只能提取键:

d1 = set([rows[0] for rows in my_data1]) 

的则不用OrderedDict,你可以尝试使用顺序组无论是从这个答案 - Does python has ordered set或使用ordered-set 模块来自pypi。

一旦获得了所有相交键,就可以编写另一个程序查找来自源csv的所有匹配值。

如果这些优化不够,您可以从较大的集合中提取所有密钥,将它们保存到一个文件中,然后使用generators从文件中逐个加载密钥,以便程序只保留一个一套钥匙加上一个钥匙而不是两套钥匙。

另外我会建议使用python pickle模块来存储中间结果。