C++ 在MATLAB中计算文件行数的最快方法(Perl比C快?)

C++ 在MATLAB中计算文件行数的最快方法(Perl比C快?),c++,c,performance,perl,matlab,C++,C,Performance,Perl,Matlab,在我的研究中,我必须计算10+GB csv文件中的行数。在MATLAB上执行此操作的经典方法似乎是使用textscan()和\n作为分隔符,但这会占用大量内存,而且速度非常慢。有人建议我编写一个Perl脚本,并使用str2double(Perl('countlines.pl',path))调用它,这似乎要快得多: # countlines.pl while (<>) {}; print $.,"\n"; 所以 除了网关功能外,MEX功能中的开销来自何处 我还能做些什么来加快速度吗?

在我的研究中,我必须计算10+GB csv文件中的行数。在MATLAB上执行此操作的经典方法似乎是使用
textscan()
\n
作为分隔符,但这会占用大量内存,而且速度非常慢。有人建议我编写一个Perl脚本,并使用
str2double(Perl('countlines.pl',path))
调用它,这似乎要快得多:

# countlines.pl
while (<>) {};
print $.,"\n";
所以

  • 除了网关功能外,MEX功能中的开销来自何处
  • 我还能做些什么来加快速度吗?我愿意使用任何语言,只要我们能让例程与MATLAB接口。似乎唯一的另一种方法是内存映射文件块,并将工作负载分割到几个核心上
  • 除了网关功能外,MEX功能中的开销来自何处

  • MEX函数正在分配内存
  • 函数正在将内存转换为字符串
  • 函数正在创建一个双精度矩阵
  • 不能与Perl的简单行计数函数进行比较,因为它们在功能上并不等价

    我还能做些什么来加快速度吗? 是,只计算行数。
    没有额外的东西,比如读《双打矩阵》

    下面是一个使用C++计算文本文件中的行数的示例:

    std::ifstream text_file(/*...*/);
    std::string   text_from_file;
    unsigned int  line_count = 0;
    while (std::getline(text_file, '\n'))
    {
      ++line_count;
    }
    
    在比较性能时,功能必须相同。

    编辑1:
    决定你在数线吗

    你在计算矩阵中的行数吗

    是否只对文件中的行进行计数

    如果要计算矩阵中的行数,需要修改Perl脚本

    如果希望MEX函数仅对行进行计数,请删除对
    countlines
    函数的调用以外的所有内容

    为什么要使用双倍<代码>进行行计数?
    你是在期待分数线计数吗

    你想使用C/I/O还是C++ I/O?< /P> 分块读取数据将加快您的C I/O功能:

    #define MAX_CHUNK_SIZE 1024*1024
    char buffer[MAX_CHUNK_SIZE];
    size_t chars_read = 0;
    unsigned int line_count = 0;
    //...
    while (!feof(inputFile))
    {
      chars_read = fread(buffer, 1, MAX_CHUNK_SIZE, input_file);
      char c;
      for (unsigned int i = 0; i < chars_read; ++i)
      {
         if (c == '\n')
         {
           ++line_count;
         }
      }
    }
    
    #定义最大块大小1024*1024
    字符缓冲区[最大块大小];
    大小字符读取=0;
    无符号整数行计数=0;
    //...
    而(!feof(inputFile))
    {
    chars\u read=fread(缓冲区,1,最大块大小,输入文件);
    字符c;
    for(无符号整数i=0;i
    访问文件的瓶颈是查找数据的开销。大量阅读可以减少开销

    除了网关功能外,MEX功能中的开销来自何处

  • MEX函数正在分配内存
  • 函数正在将内存转换为字符串
  • 函数正在创建一个双精度矩阵
  • 不能与Perl的简单行计数函数进行比较,因为它们在功能上并不等价

    我还能做些什么来加快速度吗? 是,只计算行数。
    没有额外的东西,比如读《双打矩阵》

    下面是一个使用C++计算文本文件中的行数的示例:

    std::ifstream text_file(/*...*/);
    std::string   text_from_file;
    unsigned int  line_count = 0;
    while (std::getline(text_file, '\n'))
    {
      ++line_count;
    }
    
    在比较性能时,功能必须相同。

    编辑1:
    决定你在数线吗

    你在计算矩阵中的行数吗

    是否只对文件中的行进行计数

    如果要计算矩阵中的行数,需要修改Perl脚本

    如果希望MEX函数仅对行进行计数,请删除对
    countlines
    函数的调用以外的所有内容

    为什么要使用双倍<代码>进行行计数?
    你是在期待分数线计数吗

    你想使用C/I/O还是C++ I/O?< /P> 分块读取数据将加快您的C I/O功能:

    #define MAX_CHUNK_SIZE 1024*1024
    char buffer[MAX_CHUNK_SIZE];
    size_t chars_read = 0;
    unsigned int line_count = 0;
    //...
    while (!feof(inputFile))
    {
      chars_read = fread(buffer, 1, MAX_CHUNK_SIZE, input_file);
      char c;
      for (unsigned int i = 0; i < chars_read; ++i)
      {
         if (c == '\n')
         {
           ++line_count;
         }
      }
    }
    
    #定义最大块大小1024*1024
    字符缓冲区[最大块大小];
    大小字符读取=0;
    无符号整数行计数=0;
    //...
    而(!feof(inputFile))
    {
    chars\u read=fread(缓冲区,1,最大块大小,输入文件);
    字符c;
    for(无符号整数i=0;i

    访问文件的瓶颈是查找数据的开销。大量阅读可以减少开销。

    您是否阅读过Perl关于此主题的常见问题解答,其中给出了大约6个示例

    wc
    命令已移植到Windows,因此如果您想安装它,这可能是最好的解决方案。否则,我将在
    wc
    示例之前使用Perl示例(下面已修复并优化)

        my $lines = 0;
        open my $fh, '<:raw', $filename
            or die "Can't open $filename: $!";
        while( sysread $fh, $buffer, 64*1024 ) {
            $lines += ( $buffer =~ tr|\n||; );
        }
        close $fh;
    
    my$line=0;
    
    打开我的$fh,“你读过Perl关于这个主题的FAQ吗,它给出了大约6个例子

    wc
    命令已移植到Windows,因此如果您想安装它,这可能是最好的解决方案。否则,我将在
    wc
    示例之前使用Perl示例(下面已修复并优化)

        my $lines = 0;
        open my $fh, '<:raw', $filename
            or die "Can't open $filename: $!";
        while( sysread $fh, $buffer, 64*1024 ) {
            $lines += ( $buffer =~ tr|\n||; );
        }
        close $fh;
    
    my$line=0;
    
    在这段代码中打开我的$fh,“,计算行的总数。但这需要几部迷你们车

    my $lines = do {
        open my $fh, '<', "filename" or die "Can't open filename: $!";
        1 while (<$fh>);
        $.
    };
    print "Total number of lines: $lines\n";
    
    my$lines=do{
    
    在这段代码中打开我的$fh,“来计算行的总数。但是这需要几个mini

    my $lines = do {
        open my $fh, '<', "filename" or die "Can't open filename: $!";
        1 while (<$fh>);
        $.
    };
    print "Total number of lines: $lines\n";
    
    my$lines=do{
    
    打开my$fh,“要有效地计算行数,只需执行以下操作:

    int main()
    {
       unsigned long lines = 0;
       int c; /* c must be an int, not char */
    
       while ((c = getchar()) != EOF) 
          if (c == '\n') 
             lines++;
       printf("%lu\n", lines);
       return 0;
    } /* main */
    

    我认为Kernighan&Ritchie中有一个类似的例子,如果不一样的话。请不要下次使用
    double
    进行计数。使用整数类型进行计数要比使用浮点数进行计数有效得多。

    要有效地对行进行计数,只需执行以下操作:

    int main()
    {
       unsigned long lines = 0;
       int c; /* c must be an int, not char */
    
       while ((c = getchar()) != EOF) 
          if (c == '\n') 
             lines++;
       printf("%lu\n", lines);
       return 0;
    } /* main */
    
    我认为Kernighan&Ritchie中有一个类似的例子,如果不一样的话。请不要使用
    双精度
    下次计数。