【发布时间】: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,谢谢你,我按照你说的做了,我认为问题已经解决了,请你详细说明一下到底发生了什么,因为即使我只打开一个文件,我也得到了这个错误.我不明白为什么?
-
当然。要读取或写入文件,您需要文件描述符。它基本上是打开文件并进行一些操作的连接。但它有一些限制取决于操作系统。您可以将其扩展到某个限制但不是无限的。因此,每当您使用文件或线程时,请记住,一旦完成目的,它就应该关闭。它可以拯救你。