C ++性能写入和从磁盘读取

时间:2013-01-23 08:56:10

标签: c++ performance

  

可能重复:
  Writing a binary file in C++ very fast

我在内存中有大量无符号32位整数(15亿条目)。我需要将它们写入文件并将它们读回主存。

现在,我使用:

ofstream ofs;
ofs.open(filename);
for (uint64_t i = 0 ; i < 1470000000 ; i++)
ofs << integers << " " ;

ifstream ifs;
ifs.open(filename);
for (uint64_t i = 0 ; i < 1470000000 ; i++)
ifs >> integers ;

这需要几分钟才能执行。任何人都可以帮助我,有没有任何库方法以更快的方式做到这一点?或任何建议,所以我可以进行性能测试?任何人都可以向我展示一些使用mmap来执行上述操作的简单C ++代码(在Linux上)吗?

编辑:示例案例

#include<iostream>
#include <stdint.h>
#include <cstdio>
#include <cstdlib>
#include <sstream>

using namespace std;

main()
{
      uint32_t* ele = new uint32_t [100] ;
      for(int i = 0; i < 100 ; i++ )
      ele[i] = i ;

      for(int i = 0; i < 100 ; i++ ){
          if(ele[i] < 20)
          continue ;
          else
          // write  ele[i] to file
          ;   
      }

 for(int i = 0; i < 100 ; i++ ){
          if(ele[i] < 20)
          continue ;
          else
          // read  number from file
          // ele[i] = number * 10 ;
          ;   
      }

     std::cin.get();
}

4 个答案:

答案 0 :(得分:2)

要做的第一件事是确定时间的去向。 格式化和解析文本并不简单,可以采取一些措施 时间,但实际的写作和阅读,鉴于大小 的文件。第二件事是确定&#34;便携式&#34; 数据必须是:最快的解决方案几乎肯定是 mmap(或其Windows等价物)文件的数组 直接,永远不会读或写。这没有提供 然而,便携式表示,甚至升级 编译器可能会使数据不可读。 (不太可能是32位 今天是整数,但过去曾发生过这种情况。)

一般来说,如果是时间阅读和写作,你 我们想要使用mmap进行调查。如果它要去 格式化和解析,你会想要调查一些 二进制格式 - 这也可以帮助阅读和写作 如果它使得结果文件更小。最简单的二进制文件 格式,使用普通网络标准写入值, 只需要:

void
writeInt( std::ostream& dest, int32_t integer )
{
    dest.put( (integer >> 24) & 0xFF );
    dest.put( (integer >> 16) & 0xFF );
    dest.put( (integer >>  8) & 0xFF );
    dest.put( (integer      ) & 0xFF );
}

int32_t
readInt( std::istream& source )
{
    int32_t results = 0;
    results  = source.get() << 24;
    results |= source.get() << 16;
    results |= source.get() <<  8;
    results |= source.get();
    return results;
}

(显然需要添加一些错误检查。)

如果许多整数实际上很小,你可以尝试一些 可变长度编码,例如Google协议中使用的编码 缓冲区。如果你的大多数整数都在-64 ... 63范围内, 这可能导致文件只有四分之一的大小( 再次,将改善读写所需的时间)。

答案 1 :(得分:2)

如果你知道大小只是fwrite / fread一个数组。

答案 2 :(得分:2)

通过为输入和输出流使用更大的缓冲区,可以获得更好的性能:

ofstream ofs;
char * obuffer = new char[bufferSize];
ofs.rdbuf ()->pubsetbuf (obuffer, bufferSize);
ofs.open (filename);

ifstream ifs;
char * ibuffer = new char[bufferSize];
ifs.rdbuf ()->pubsetbuf (ibuffer, bufferSize);
ifs.open (filename);

同样ifs >> integers ;是解析整数的相当慢的方法。尝试读取行,然后使用std::strtol()来解析它们。 IME,它的速度要快得多。

答案 3 :(得分:0)

如果您只想复制,可以使用它来获得更好的性能:

std::ifstream  input("input");
std::ofstream  output("ouptut");
output << input.rdbuf();

或者设置缓冲区大小可能会提高速度:

char cbuf[buf_size];
ifstream fin;
fin.rdbuf()->pubsetbuf(cbuf,buf_size);

在我的回答中我没有考虑长int问题,因为我根本不知道为什么它们应该影响流性能,但我希望它无论如何都有帮助。