Я использую код, который всегда работал для меня. На этот раз я запустил 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
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]
Прежде всего, создайте скрипт 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
Сколько памяти у вашего компьютера?
Вы можете добавить пару оптимизаций, которые сэкономят некоторую память, а если этого недостаточно, вы можете обменять некоторые ресурсы процессора и ввода-вывода на более высокую эффективность памяти.
Если вы сравниваете только ключи и ничего не делаете со значениями, вы можете извлечь только ключи:
d1 = set([rows[0] for rows in my_data1])
Тогда вместо OrderedDict вы можете попробовать использовать упорядоченный набор из этого ответа - Есть ли у python упорядоченный набор или с помощью упорядоченный набор модуль от pypi.
Как только вы получили все пересекающиеся ключи, вы можете написать другую программу, которая ищет все совпадающие значения из исходного CSV.
Если этих оптимизаций недостаточно, вы можете извлечь все ключи из большего набора, сохранить их в файл, а затем загрузить ключи один за другим из файла, используя Generators, поэтому в программе у вас будет только один набор ключей плюс один ключ вместо двух наборов.
Также я бы предложил использовать Python pickle модуль для хранения промежуточных результатов.
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.