Я использую код, который всегда работал для меня. На этот раз я запустил 2 файла .csv: «данные» (24 МБ) и «данные1» (475 МБ). «data» имеет 3 столбца по 680000 элементов в каждом, тогда как «data1» имеет 3 столбца по 33000000 элементов в каждом. Когда я запускаю код, я получаю просто «Killed: 9» после примерно 5 минут обработки. Если это проблема с памятью, как ее решить? Любое предложение приветствуется!

Это код:

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

Заголовок «data1»:

    V2  V4  V5
10468   TC  T
10491   CC  C
10518   TG  T
10532   AG  A
10582   TG  T
10
Lucas 14 Дек 2015 в 16:39

3 ответа

Лучший ответ

Скорее всего, ядро убивает его, потому что ваш скрипт потребляет слишком много памяти. Вам нужно использовать другой подход и попытаться минимизировать размер данных в памяти.

Вы также можете найти этот вопрос полезным: Очень большие матрицы с использованием Python и 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]
10
Community 23 Май 2017 в 11:55

Прежде всего, создайте скрипт 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
1
ajsp 14 Дек 2015 в 15:22

Сколько памяти у вашего компьютера?

Вы можете добавить пару оптимизаций, которые сэкономят некоторую память, а если этого недостаточно, вы можете обменять некоторые ресурсы процессора и ввода-вывода на более высокую эффективность памяти.

Если вы сравниваете только ключи и ничего не делаете со значениями, вы можете извлечь только ключи:

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

Тогда вместо OrderedDict вы можете попробовать использовать упорядоченный набор из этого ответа - Есть ли у python упорядоченный набор или с помощью упорядоченный набор модуль от pypi.

Как только вы получили все пересекающиеся ключи, вы можете написать другую программу, которая ищет все совпадающие значения из исходного CSV.

Если этих оптимизаций недостаточно, вы можете извлечь все ключи из большего набора, сохранить их в файл, а затем загрузить ключи один за другим из файла, используя Generators, поэтому в программе у вас будет только один набор ключей плюс один ключ вместо двух наборов.

Также я бы предложил использовать Python pickle модуль для хранения промежуточных результатов.

1
Community 23 Май 2017 в 10:30