C/C++;系统可移植更改最大打开文件数的方法 我有一个C++程序,它能调换一个非常大的矩阵。矩阵太大,无法保存在内存中,因此我将每列写入一个单独的临时文件,然后在处理完整个矩阵后连接临时文件。但是,我现在发现我遇到了打开的临时文件太多的问题(即操作系统不允许我打开足够的临时文件)。是否有一种系统可移植的方法来检查(并希望更改)允许打开的最大文件数

C/C++;系统可移植更改最大打开文件数的方法 我有一个C++程序,它能调换一个非常大的矩阵。矩阵太大,无法保存在内存中,因此我将每列写入一个单独的临时文件,然后在处理完整个矩阵后连接临时文件。但是,我现在发现我遇到了打开的临时文件太多的问题(即操作系统不允许我打开足够的临时文件)。是否有一种系统可移植的方法来检查(并希望更改)允许打开的最大文件数,c++,file-io,matrix,operating-system,temporary-files,C++,File Io,Matrix,Operating System,Temporary Files,我意识到我可以关闭每个临时文件,并在需要时重新打开,但我担心这样做会影响性能 我的代码如下所示(伪代码-不保证工作): int Ncol=5000;//例如,可能要大得多。 int Nrow=50000;//例如,事实上要大得多。 //阶段1-创建临时文件 向量tmp_文件(Ncol);//临时文件指针的向量。 向量tmp_文件名(Ncol);//临时文件名的向量。 for(unsigned int ui=0;uigood()) 错误(“无法打开临时文件。\n”);//调用错误函数 (*tmp_

我意识到我可以关闭每个临时文件,并在需要时重新打开,但我担心这样做会影响性能

我的代码如下所示(伪代码-不保证工作):

int Ncol=5000;//例如,可能要大得多。
int Nrow=50000;//例如,事实上要大得多。
//阶段1-创建临时文件
向量tmp_文件(Ncol);//临时文件指针的向量。
向量tmp_文件名(Ncol);//临时文件名的向量。
for(unsigned int ui=0;uigood())
错误(“无法打开临时文件。\n”);//调用错误函数

(*tmp_文件)至少有两个限制:

  • 操作系统可能会施加限制;在Unix(sh、bash和类似的shell)中,使用
    ulimit
    在系统管理员允许的范围内更改限制
  • C库的实现可能也有限制;您可能需要重新编译该库来更改它

一个更好的解决方案是避免有这么多打开的文件。在我自己的一个程序中,我围绕文件抽象编写了一个包装器(这是用Python编写的,但原理在C中是一样的),它跟踪每个文件中当前的文件位置,并根据需要打开/关闭文件,保留一个当前打开的文件池。

没有一种可移植的方法来更改最大打开文件数。这样的限制往往是由操作系统强加的,因此是特定于操作系统的


最好的办法是减少每次打开的文件数量。

制作一个大文件而不是许多小临时文件怎么样?这是一个廉价的操作。不管怎样,您的列的大小都应该相同。您应该能够将文件指针定位在访问列所需的位置

 // something like...

 column_position = sizeof(double)*Nrows*column ;
 is.seekg(column_position) ;
 double column[Nrows] ;
 for( i = 0 ; i < Nrows ; i++ )
    is >> column[i] ;
//类似于。。。
列位置=大小(双)*Nrows*列;
is.seekg(立柱位置);
双柱[Nrows];
对于(i=0;i>列[i];

您可以将输入文件规范化为临时文件,以便每个条目占用相同数量的字符。您甚至可以考虑将该临时文件保存为二进制(使用每个字节4/8个字节,而不是每十进制数字1个字节)。这样,您就可以根据文件中每个条目在矩阵中的坐标计算其位置。然后,您可以通过执行a来访问特定条目,而不必担心打开文件的数量限制。

矩阵太大,无法保存在内存中。不过,这个矩阵很可能适合您的地址空间。(如果矩阵不能容纳2^64字节,则需要一个非常出色的文件系统来保存所有这些临时文件。)因此,不要担心临时文件。让操作系统处理交换到磁盘的工作方式。您只需要确保以交换友好的方式访问内存。在实践中,这意味着您需要具有某些引用位置。但是有了16GB的RAM,您可以在中映射约400万页的RAM。如果您的ColumnSn数量明显小于此数量,则应该没有问题


(不要为此使用32位系统;这不值得付出代价)

从windows*nix便携性的角度来看,系统便携性?不要认为你可以在windows上设置此参数。如果你将这些数字存储为文本,那么所有从文本到数值的转换都会影响你的性能。我阅读的格式是一种标准化的生物信息学格式,其中列实际上可以包含各种数字、文本字符串,不幸的是,从文本到数字的转换是不可避免的。(这里的格式是:)你能详细说明一下你的意思吗?在原始文件中查找以查找列?或者在临时文件中查找?对不起,我没有听清楚。不幸的是,我正在阅读的文件是文本(一种标准化的生物信息学格式),因此无法以这种方式查找。谢谢你的建议。虽然我想这不是一个硬性要求,但它们目前是文本。但最终输出格式是(另一种)标准文本格式。您是否尝试过或?
 // something like...

 column_position = sizeof(double)*Nrows*column ;
 is.seekg(column_position) ;
 double column[Nrows] ;
 for( i = 0 ; i < Nrows ; i++ )
    is >> column[i] ;