C++ 在MATLAB中计算文件行数的最快方法(Perl比C快?)
在我的研究中,我必须计算10+GB csv文件中的行数。在MATLAB上执行此操作的经典方法似乎是使用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功能中的开销来自何处 我还能做些什么来加快速度吗?
textscan()
和\n
作为分隔符,但这会占用大量内存,而且速度非常慢。有人建议我编写一个Perl脚本,并使用str2double(Perl('countlines.pl',path))
调用它,这似乎要快得多:
# countlines.pl
while (<>) {};
print $.,"\n";
所以
没有额外的东西,比如读《双打矩阵》 下面是一个使用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功能中的开销来自何处
没有额外的东西,比如读《双打矩阵》 下面是一个使用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中有一个类似的例子,如果不一样的话。请不要使用双精度下次计数。