Errno 24 Слишком много открытых файлов при добавлении в большой файл CSV - PullRequest
0 голосов
/ 28 августа 2018

Я извлекаю некоторую информацию о генах из базы данных, сохраняю ее в словаре после некоторых модификаций и добавляю в файл CSV.

Общее количество генов составляет 489299, поэтому в конце у меня будет файл csv с 489299 строками, сценарий будет работать гладко, когда я проверил его на 10000 генах, но в случае 489299 я получил ошибку:

OSError: [Errno 24] Слишком много открытых файлов: 'output_agrold / Genes.csv'

Вот фрагмент кода, который я использую:

# I have batches of Genes
batches = ["Gene1 Gene2...", "Gene11 Gene12..."]
for batch in batches:
    genes_batch_dico = create_genes_info_dico(batch)
    # genes_batch_dico is a List of dictionnaries which has info about genes
    # genes_batch_dico = [{info about gene1}, {info about gene2}, ...]
    for gene_dico in genes_batch_dico:
        # I get info from gene_dico : gene_id, start_pos, end_pos .....
        # here I create the CSV file
        with open(OUTPUT_PATH + '/Genes.csv', 'a') as f:
            w = csv.writer(f, delimiter=',', quoting=csv.QUOTE_ALL, quotechar='\"')
            row = [ gene_id, start_pos, end_pos .... ]
            w.writerow(row)

Я проверил количество строк в файле CSV, которое составило 52800 строк.

Когда я посмотрел в интернете, я обнаружил, что эта ошибка связана с одновременным открытием множества файлов (что, по-моему, я здесь не делаю, я имею в виду, что я добавляю / добавляю только один файл) и они предложили изменить максимальное количество открытых файлов с помощью команды ulimit -n NUMBER, поэтому я увеличил open files с 1024 до 4096. Но я все еще получаю ту же ошибку, когда число строк достигает ровно 52800 строк.

ОС: Fedora 28.

1 Ответ

0 голосов
/ 29 августа 2018

Если вы используете Python 3.x, вам нужно только один раз открыть файл CSV для записи. В настоящее время вы открываете и закрываете его в режиме добавления один раз для каждой написанной строки.

Лучшим псевдо-кодом для того, что вам нужно, будет:

import csv
import os

batches = ["Gene1 Gene2...", "Gene11 Gene12..."]

with open(os.path.join(OUTPUT_PATH, 'Genes.csv'), 'w', newline='') as f:
    w = csv.writer(f, delimiter=',', quoting=csv.QUOTE_ALL, quotechar='\"')

    for batch in batches:
        genes_batch_dico = create_genes_info_dico(batch)

        for gene_dico in genes_batch_dico:
            row = [ gene_id, start_pos, end_pos .... ]
            w.writerow(row)

os.path.join() - это более безопасный способ объединения частей пути к файлу.

Если вы все еще используете Python 2.x, измените эту строку:

with open(os.path.join(OUTPUT_PATH, 'Genes.csv'), 'wb') as f:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...