我在内存中有大量无符号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();
}
答案 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问题,因为我根本不知道为什么它们应该影响流性能,但我希望它无论如何都有帮助。