【问题标题】:Errno 24 Too many open files when appending to a large CSV fileErrno 24 附加到大型 CSV 文件时打开的文件过多
【发布时间】:2018-08-28 09:53:09
【问题描述】:

我正在从数据库中提取一些有关基因的信息,经过一些修改后将其存储在字典中,并将其附加到 CSV 文件中。

基因总数为 489299,所以最后我将有一个 489299 行的 csv 文件,当我在 10000 个基因上测试它时脚本运行顺利,但在 489299 的情况下我得到了错误:

OSError: [Errno 24] 打开的文件太多:'output_agrold/Genes.csv'

这是我正在使用的代码的 sn-p:

# 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 命令修改opene 文件的最大数量,所以我将open files 从1024 增加到4096。但是当行数恰好达到52800 行时,我仍然遇到同样的错误。

操作系统:Fedora 28。

【问题讨论】:

  • 是的。您达到最大文件描述符限制。你为什么不在循环之前打开文件?并在循环结束时关闭它。或者在写操作完成后关闭它。
  • @ManojJadhav,谢谢你,我按照你说的做了,我认为问题已经解决了,请你详细说明一下到底发生了什么,因为即使我只打开一个文件,我也得到了这个错误.我不明白为什么?
  • 当然。要读取或写入文件,您需要文件描述符。它基本上是打开文件并进行一些操作的连接。但它有一些限制取决于操作系统。您可以将其扩展到某个限制但不是无限的。因此,每当您使用文件或线程时,请记住,一旦完成目的,它就应该关闭。它可以拯救你。

标签: python linux csv


【解决方案1】:

假设您使用的是 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:

【讨论】:

  • Currently you are opening and closing it in append mode once for each line you write 所以就像我多次打开文件会导致错误一样。谢谢!
猜你喜欢
  • 2019-04-11
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 2017-01-25
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多