我目前从一个向量写一组双打到一个文本文件,如下所示:
std::ofstream fout;
fout.open("vector.txt");
for (l = 0; l < vector.size(); l++)
fout << std::setprecision(10) << vector.at(l) << std::endl;
fout.close();
Run Code Online (Sandbox Code Playgroud)
但这需要花费大量时间才能完成.有没有更快或更有效的方法来做到这一点?我很乐意看到并学习它.
这里有一些代码,在做了一些测量之后是一个相当大的瓶颈:
//-----------------------------------------------------------------------------
// Construct dictionary hash set from dictionary file
//-----------------------------------------------------------------------------
void constructDictionary(unordered_set<string> &dict)
{
ifstream wordListFile;
wordListFile.open("dictionary.txt");
std::string word;
while( wordListFile >> word )
{
if( !word.empty() )
{
dict.insert(word);
}
}
wordListFile.close();
}
Run Code Online (Sandbox Code Playgroud)
我正在读大约200,000字,这在我的机器上大约需要240毫秒.ifstream这里使用效率高吗?我可以做得更好吗?我正在阅读有关mmap()实现的内容,但我并不是100%理解它们.输入文件只是带有*nix行终止的文本字符串.
编辑:建议替代方案的后续问题:任何替代方案(减去增加流缓冲区大小)是否意味着我编写了一个解析每个字符的解析器?我有点像流的简单语法,但如果我需要速度,我可以重新写一些更细节的东西.将整个文件读入内存是一个可行的选择,它只有2mb左右.
编辑#2: 我发现对我的减速是由于设置插入,但对于那些仍然有兴趣加快逐行文件IO的人,请在这里阅读答案并查看Matthieu M.的关于这个主题的继续.
我试图在InterviewStreet上解决问题.一段时间后,我确定我实际上花了大量时间阅读输入.这个特殊的问题有很多输入,所以这有点意义.没有意义的是为什么不同的输入方法具有如此不同的表现:
最初我有:
std::string command;
std::cin >> command;
Run Code Online (Sandbox Code Playgroud)
更换它使它明显更快:
char command[5];
cin.ignore();
cin.read(command, 5);
Run Code Online (Sandbox Code Playgroud)
重写使用scanf的所有内容使其更快
char command;
scanf("get_%c", &command);
Run Code Online (Sandbox Code Playgroud)
总而言之,我把读取输入的时间减少了大约1/3.
我想知道这些不同方法之间的性能存在这样的差异.另外,我想知道为什么使用gprof没有强调我在I/O上花费的时间,而是似乎指责我的算法.
我正在制作一个处理txt文件数据的应用程序.
这个想法是txt文件可能有不同的格式,应该读入C++.
一个例子可能是3I2, 3X, I3,应该这样做:"首先我们有3个长度为2的整数,然后我们有3个空点,然后我们有1个长度为3的整数.
是最好迭代文件,产生线,然后迭代线作为字符串?什么是一个有效的方法迭代巧妙地省略3个点被忽略?
例如
101112---100
102113---101
103114---102
Run Code Online (Sandbox Code Playgroud)
至:
10, 11, 12, 100
10, 21, 13, 101
10, 31, 14, 102
Run Code Online (Sandbox Code Playgroud) 我想知道为什么会一直这样...... !! 我在c中编写了两个程序,在c ++中编写了另一个程序.两者都执行相同的操作.即打印1到2000000之间的数字.此外,我在执行开始时设置计时器..并且在打印之后还打印所有经过的时间.c ++程序所用的时间总是大于交流程序.我觉得时间差异很大.我很想知道这是什么原因.. ???? ..
这是两个程序
//iotest.c
#include<stdio.h>
#include<time.h>
clock_t start=clock();
int main()
{
for(int i=0;i<2000000;i++)
printf("%d\n",i);
printf("Time Elapsed: %f\n",((double)clock()-start)/CLOCKS_PER_SEC);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
//iotest.cpp
#include<iostream>
#include<time.h>
using namespace std;
clock_t start=clock();
int main()
{
for(int i=0;i<2000000;i++)
cout<<i<<endl;
cout<<"Time elapsed "<<((double)clock()-start)/CLOCKS_PER_SEC<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
// ver C++ 4.3.2通过发出命令编译c程序
g ++ iotest.c
执行给出
1
.
.
2000000
经过的时间:5.410000(并不总是相同..)
执行第二个程序
1
.
.
2000000
时间流逝:5.81(并非总是相同..)
我有大文件,包含少量大数据集.每个数据集包含一个名称和数据集大小(以字节为单位),允许跳过它并转到下一个数据集.
我想非常快速地建立数据集名称的索引.文件示例大约21MB,包含88个数据集.通过使用std::ifstream和seekg()在数据集之间跳过快速读取88个名称需要大约1300毫秒,我想减少.
事实上,我正在读取大约30个字节的88个块,在21MB文件中的给定位置,需要1300ms.
有没有办法改善这一点,还是操作系统和文件系统限制?我在Windows 7 64bit下运行测试.
我知道在文件开头有一个完整的索引会更好,但文件格式没有这个,我们无法改变它.
在我的情况下,我有不同的文件让我们假设我有4GB文件的数据.我想逐行读取该文件并处理每一行.我的一个限制是软件必须在32位MS Windows上运行,或者在64位上运行少量RAM(最小4GB).您还可以假设这些行的处理不是瓶颈.
在当前的解决方案中,我读取该文件ifstream并复制到某个字符串.这是片段的样子.
std::ifstream file(filename_xml.c_str());
uintmax_t m_numLines = 0;
std::string str;
while (std::getline(file, str))
{
m_numLines++;
}
Run Code Online (Sandbox Code Playgroud)
好的,这是有效的,但在这里慢慢地是我的3.6 GB数据的时间:
real 1m4.155s
user 0m0.000s
sys 0m0.030s
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种比这更快的方法,例如我发现如何快速解析C++中空格分隔的浮点数?我喜欢用boost :: mapped_file提出解决方案,但我遇到了另一个问题,如果我的文件是大的,在我的情况下文件1GB大到足以放弃整个过程.我不得不关心内存中的当前数据,可能使用该工具的人的RAM安装量不超过4 GB.
所以我发现了来自boost的mapped_file但是在我的情况下如何使用它?是否可以部分读取该文件并接收这些行?
也许你有另一个更好的解决方案.我必须处理每一行.
谢谢,
巴特
如果我想通过管道将数据字节输入 Linux 上的 C/C++ 程序,如下所示:
cat my_file | ./my_app
但:
从 C/C++ 应用程序读取管道的最快技术是什么?
我做了一点研究,发现:
read()std::cin.read()popen() 但我不确定是否有更好的方法,或者以上哪种方法更好。
编辑:对此有性能要求,因此我要求使用开销最小的技术。