相关疑难解决方法(0)

将数据从std :: vector写入文本文件的快速方法

我目前从一个向量写一组双打到一个文本文件,如下所示:

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)

但这需要花费大量时间才能完成.有没有更快或更有效的方法来做到这一点?我很乐意看到并学习它.

c++ std ofstream

55
推荐指数
5
解决办法
7870
查看次数

如何加快逐行读取ASCII文件的速度?(C++)

这里有一些代码,在做了一些测量之后是一个相当大的瓶颈:

//-----------------------------------------------------------------------------
//  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.的关于这个主题的继续.

c++ optimization file-io ifstream

11
推荐指数
1
解决办法
6664
查看次数

C++输入性能

我试图在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上花费的时间,而是似乎指责我的算法.

c++ performance profiling iostream stdio

8
推荐指数
1
解决办法
864
查看次数

使用C++中的Fortran格式迭代文本文件

我正在制作一个处理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++ parsing fortran text-parsing

8
推荐指数
4
解决办法
2353
查看次数

造成这种差异的原因......从C++到C?

我想知道为什么会一直这样...... !! 我在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(并非总是相同..)

c c++

5
推荐指数
3
解决办法
585
查看次数

C++ /快速随机访问在大文件中跳过

我有大文件,包含少量大数据集.每个数据集包含一个名称和数据集大小(以字节为单位),允许跳过它并转到下一个数据集.

我想非常快速地建立数据集名称的索引.文件示例大约21MB,包含88个数据集.通过使用std::ifstreamseekg()在数据集之间跳过快速读取88个名称需要大约1300毫秒,我想减少.

事实上,我正在读取大约30个字节的88个块,在21MB文件中的给定位置,需要1300ms.

有没有办法改善这一点,还是操作系统和文件系统限制?我在Windows 7 64bit下运行测试.

我知道在文件开头有一个完整的索引会更好,但文件格式没有这个,我们无法改变它.

c++ file random-access

4
推荐指数
2
解决办法
840
查看次数

如何在32位系统上读取4GB文件

在我的情况下,我有不同的文件让我们假设我有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但是在我的情况下如何使用它?是否可以部分读取该文件并接收这些行?

也许你有另一个更好的解决方案.我必须处理每一行.

谢谢,
巴特

c++ boost 32-bit data-processing large-files

3
推荐指数
2
解决办法
1727
查看次数

从 C/C++ 程序读取管道的最快方法?

如果我想通过管道将数据字节输入 Linux 上的 C/C++ 程序,如下所示:

cat my_file | ./my_app

但:

  1. 我们不能假设管道数据将来自文件
  2. 我们希望将数据解释为文件中的字节(而不是字符串)

从 C/C++ 应用程序读取管道的最快技术是什么?

我做了一点研究,发现:

  • read()
  • std::cin.read()
  • popen()

但我不确定是否有更好的方法,或者以上哪种方法更好。

编辑:对此有性能要求,因此我要求使用开销最小的技术。

c++ unix linux shell pipe

0
推荐指数
1
解决办法
6263
查看次数