在Windows(Visual Studio Compiler)和Linux上是否存在用于从文件读取行的替代且可移植的算法实现?

时间:2019-05-22 05:40:01

标签: c++ c performance c++11 c99

现在我正在使用C ++ 11:

long long int linecount;
fileifstream.open( filepath );

if( std::getline( fileifstream, newline ) ) 
{
    linecount += 1;
    // do some stuff with line and throw it out
}

fileifstream.close();

我会尝试使用此C getline(),但在Windows(Visual Studio cl.exe编译器)下不可用:

FILE * ifile = fopen( filename, "r" );
size_t linesz = 0;
char * line = nullptr;
unsigned int linecount = 0;

while( getline( &line, &linesz, ifile ) > 0 ) 
{
    linecount++;
    // do some stuff with line and throw it out
}

free( line );
std::cout << "Lines count: " << linecount << std::endl;
fclose(ifile);

在单独读取/处理每一行时,可以更快地读取文件中的行(即,使用其他标准实现的时间更少),而不必一次将整个文件加载到内存中(假设10GB数据)文件放在具有8GB RAM的计算机上)?

  

文件的最大大小是否存在已知限制?

否,该文件可以具有1MB或40GB。整个文件不必在内存中,一次只需要一行。但是,您不仅可以读取一行(以块为单位?),还可以读取1GB或更多的内容。

  

如果有N个CPU,则您希望能够并行处理“最多N个”文件,而正在读取下N个文件。

我将假设仅是一个线程应用程序/算法,因为该文件需要按行进行解析,并且要同步所有这些线程以免彼此陷入中间并不容易,并且需要真正复杂的实现。 / p>

  

还请注意,最大性能(尤其是文件已经被操作系统缓存在RAM中或位于快速SSD上时);

文件未缓存在RAM中。 RAM是免费的,文件需要来自文件系统并由行进行解析。

相关:

  1. https://codereview.stackexchange.com/questions/115744/c-stack-implementation-using-stdlist
  2. std::ifstream in binary mode and locale in C++
  3. https://codereview.stackexchange.com/questions/119219/c-getline-implementation
  4. Performance difference of getline operating with istream and FILE*

如评论中所述,有getline自定义实现可以试用:

  1. Are there alternate implementations of GNU getline interface?

0 个答案:

没有答案