相关疑难解决方法(0)

为什么在C++中读取stdin的行比Python要慢得多?

我想比较使用Python和C++从stdin读取字符串的读取行,并且看到我的C++代码运行速度比等效的Python代码慢一个数量级,这让我很震惊.由于我的C++生锈了,我还不是专家Pythonista,请告诉我,如果我做错了什么或者我是否误解了什么.


(TLDR回答:包括声明:cin.sync_with_stdio(false)或者只是fgets改用.

TLDR结果:一直向下滚动到我的问题的底部并查看表格.)


C++代码:

#include <iostream>
#include <time.h>

using namespace std;

int main() {
    string input_line;
    long line_count = 0;
    time_t start = time(NULL);
    int sec;
    int lps;

    while (cin) {
        getline(cin, input_line);
        if (!cin.eof())
            line_count++;
    };

    sec = (int) time(NULL) - start;
    cerr << "Read " << line_count << " lines in " << sec << " seconds.";
    if (sec > 0) {
        lps = line_count / sec;
        cerr << " LPS: " << lps …
Run Code Online (Sandbox Code Playgroud)

c++ python benchmarking iostream getline

1738
推荐指数
10
解决办法
25万
查看次数

如何在C++中对字符串进行标记?

Java有一个方便的拆分方法:

String str = "The quick brown fox";
String[] results = str.split(" ");
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法在C++中执行此操作?

c++ string split tokenize

400
推荐指数
18
解决办法
53万
查看次数

用c ++快速读取文本文件

我目前正在用c ++编写一个程序,其中包括阅读大量的大文本文件.每行有~400.000行,极端情况下每行有4000或更多字符.仅供测试,我使用ifstream和cplusplus.com提供的实现读取其中一个文件.花了大约60秒,这太长了.现在我想知道,有没有一种直接的方法来提高阅读速度?

编辑:我使用的代码或多或少是这样的:

string tmpString;
ifstream txtFile(path);
if(txtFile.is_open())
{
    while(txtFile.good())
    {
        m_numLines++;
        getline(txtFile, tmpString);
    }
    txtFile.close();
}
Run Code Online (Sandbox Code Playgroud)

编辑2:我读的文件只有82 MB大.我主要说它可以达到4000,因为我认为可能有必要知道为了做缓冲.

编辑3:谢谢大家的答案,但考虑到我的问题似乎没有太大的改进空间.我必须使用readline,因为我想计算行数.将ifstream实例化为二进制文件也不会使读取速度更快.我将尝试尽可能地并行化它,至少应该起作用.

编辑4:显然我可以做一些事情.非常感谢你花了这么多时间,我非常感激!=)

c++ io performance ifstream

58
推荐指数
4
解决办法
6万
查看次数

C和C++样式文件IO之间的性能差异

我一直听说C++文件I/O操作比C风格I/O慢得多.但我没有找到任何实际的参考文件,因为它们实际上有多慢,所以我决定在我的机器上测试它(Ubuntu 12.04,GCC 4.6.3,ext4分区格式).

首先,我在磁盘中写了一个~900MB的文件.

C++(ofstream):163s

ofstream file("test.txt");

for(register int i = 0; i < 100000000; i++) 
    file << i << endl;
Run Code Online (Sandbox Code Playgroud)

C(fprintf):12s

FILE *fp = fopen("test.txt", "w");

for(register int i = 0; i < 100000000; i++) 
    fprintf(fp, "%d\n", i);
Run Code Online (Sandbox Code Playgroud)

我期待这样的输出,它表明在C++ C中写入文件要慢得多.然后我使用C和C++ I/O读取相同的文件.让我感到惊讶的是,从文件中读取时,性能几乎没有差异.

C++(ifstream):12s

int n;
ifstream file("test.txt");

for(register int i = 0; i < 100000000; i++) 
    file >> n;
Run Code Online (Sandbox Code Playgroud)

C(fscanf):12s

FILE *fp = fopen("test.txt", "r");

for(register int i = 0; i < …
Run Code Online (Sandbox Code Playgroud)

c c++ file-io stream

24
推荐指数
2
解决办法
8766
查看次数

在C++中有效地读取非常大的文本文件

我有一个非常大的文本文件(45GB).文本文件的每一行包含两个空格分隔的64位无符号整数,如下所示.

4624996948753406865 10214715013130414417

4305027007407867230 4569406367070518418

10817905656952544704 3697712211731468838 ......

我想读取文件并对数字执行一些操作.

我在C++中的代码:

void process_data(string str)
{
    vector<string> arr;
    boost::split(arr, str, boost::is_any_of(" \n"));
    do_some_operation(arr);
}

int main()
{
    unsigned long long int read_bytes = 45 * 1024 *1024;
    const char* fname = "input.txt";
    ifstream fin(fname, ios::in);
    char* memblock;

    while(!fin.eof())
    {
        memblock = new char[read_bytes];
        fin.read(memblock, read_bytes);
        string str(memblock);
        process_data(str);
        delete [] memblock;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我对c ++比较陌生.当我运行此代码时,我遇到了这些问题.

  1. 由于以字节读取文件,有时块的最后一行对应于原始文件中的未完成行("4624996948753406865 10214"而不是主文件的实际字符串"4624996948753406865 10214715013130414417").

  2. 这段代码运行得非常慢.在具有6GB RAM的64位Intel Core i7 920系统中运行一个块操作需要大约6秒.是否有任何可用于改善运行时的优化技术?

  3. 是否有必要在boost分割功能中包含"\n"和空白字符?

我已经阅读了关于C++中的mmap文件,但我不确定这是否是正确的方法.如果是,请附上一些链接.

c++ linux boost mmap external-sorting

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

使用ifstream读取浮点数

我正在尝试使用ifstream从.out文件中读取一系列浮点数,但如果我之后输出它们,则它们不正确.

这是我的输入代码:

float x, y, z;

ifstream table;
table.open("Resources/bones.out");
if (table.fail())
{
    cout << "Can't open table" << endl;
    return ;
}

table >> x;
table >> y;
table >> z;

cout << x << " " << y << " " << z << endl;

table.close();
Run Code Online (Sandbox Code Playgroud)

我的输入文件:

0.488454 0.510216 0.466979
0.487242 0.421347 0.472977
0.486773 0.371251 0.473103
...
Run Code Online (Sandbox Code Playgroud)

现在的测试,我只是阅读的第一行进入x yz和我的输出是

1 0 2
Run Code Online (Sandbox Code Playgroud)

关于为什么我没有得到正确输出的任何想法?

c++ io ifstream

9
推荐指数
1
解决办法
1万
查看次数

在VC++中读取一个boost内存映射文件的结尾

我正在使用VS2010编写一个C++程序来读取文本文件并从中提取某些信息.我使用filestream完成了代码,效果很好.但是现在我被要求将文件映射到内存并使用它而不是文件操作.

在内存映射的情况下,我绝对是一个新手.我写的代码的一部分如下.

boost::iostreams::mapped_file_source apifile;

apifile.open(LogFileName,LogFileSize);

if(!apifile.is_open()) 

return FILE_OPEN_ERROR;

// Get pointer to the data.

PBYTE Buffer = (PBYTE)apifile.data();

while(//read till end of the file)
{
     // read a line and check if it contains a specific word
}
Run Code Online (Sandbox Code Playgroud)

在使用FILESTREAM我会用eofgetlinestring::find用于执行操作.但我不知道如何使用内存映射文件来做到这一点.

编辑1:

int ProcessLogFile(string file_name)
{
    LogFileName = file_name;

    apifile.open(LogFileName);//boost::iostreams::mapped_file_source apifile(declared globally)

    streamReader.open(apifile, std::ios::binary);//boost::iostreams::stream <boost::iostreams::mapped_file_source> streamReader(declared globally)

    streamoff Curr_Offset = 0;

    string read_line;

    int session_id = 0;

    int device_id = 0;

    while(!streamReader.eof())
    {
        \\COLLECT OFFSETS OF …
Run Code Online (Sandbox Code Playgroud)

c++ memory boost visual-studio-2010

6
推荐指数
1
解决办法
6143
查看次数

解析一个浮点数的C字符串

我有一个C字符串,其中包含由逗号和空格分隔的浮点数列表.每对数字由一个(或多个)空格分隔,并表示x和y字段由逗号分隔的点(并且可选地由空格分隔).

" 10,9 2.5, 3   4 ,150.32 "
Run Code Online (Sandbox Code Playgroud)

我需要解析这个字符串以填充列表Point(x, y).
以下是我目前的实施:

const char* strPoints = getString();
std::istringstream sstream(strPoints);

float x, y;
char comma;

while (sstream >> x >> comma >> y)
{
   myList.push(Point(x, y));
}
Run Code Online (Sandbox Code Playgroud)

由于我需要解析很多(最多500,000)这些字符串,我想知道是否有更快的解决方案.

c++ string parsing

5
推荐指数
1
解决办法
1001
查看次数

有效地将std :: stringstream数据解析为std :: vector <std :: vector <double >>

我正在将一对双值的数据流解析为std :: vector>.我使用boost,因为我觉得它更有效率.我的代码如下.

                std::stringstream tmp_stream;                
                typedef double data_type;            
                typedef ::std::vector < data_type > V_d;
                // type below describes type of the container of all data
                typedef ::std::vector < V_d > V_v_d;
                // list container 
                //typedef ::std::list < V_d > V_v_d;

                V_v_d data;

                ::data_parser::Data_parser < V_v_d > data_parser;
                data_parser ( tmp_stream, data );
Run Code Online (Sandbox Code Playgroud)

我的输入文本文件格式为{(132.181,0.683431),(136.886,0.988517),(137.316,0.504297),(133.653,0.602269),(150.86,0.236839)}未正确解析对,我收到空对.可能是什么问题呢?谢谢

c++ boost stl

3
推荐指数
1
解决办法
504
查看次数

如何在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++:快速将映射文件读入矩阵的方法

我正在尝试将映射文件读入矩阵.该文件是这样的:

name;phone;city\n
Luigi Rossi;02341567;Milan\n
Mario Bianchi;06567890;Rome\n
.... 
Run Code Online (Sandbox Code Playgroud)

而且它很安静.我写的代码工作正常,但不是那么快:

#include <iostream>
#include <fstream>
#include <string>
#include <boost/iostreams/device/mapped_file.hpp>

using namespace std;

int main() {

    int i;
    int j=0;
    int k=0;

    vector< vector<char> > M(10000000, vector<string>(3));

    mapped_file_source file("file.csv");

    // Check if file was successfully opened
    if(file.is_open()) {

      // Get pointer to the data
      const char * c = (const char *)file.data();

      int size=file.size();

      for(i = 0; i < (size+1); i++){

       if(c[i]=='\n' || i==size){
        j=j+1;
        k=0;
       }else if(c[i]==';'){
        k=k+1;
       }else{
        M[j][k]+=c[i];
       }    
     }//end for …
Run Code Online (Sandbox Code Playgroud)

c++ memory boost

3
推荐指数
1
解决办法
1027
查看次数

C - 读取大量整数的最快方法?

我目前使用带有scanf的循环("%d",&value),但我需要它更快.数据量可高达2 000 000个值.有什么方法可以加快速度吗?我读到了strtok和strtol,但我不知道如何使用它们,如果它们甚至可以达到我需要的速度.

c

0
推荐指数
2
解决办法
163
查看次数