我有大约 1.5 Gb 的浮点数的数据文件,它们存储为 ASCII 文本,由空格分隔,例如,1.2334 2.3456 3.4567
等等。
在处理这些数字之前,我首先将原始文件转换为二进制格式。这很有帮助,因为我可以选择是否使用float
或double
,减小文件大小(大约 800 MBdouble
和 400 MB float
),并在处理数据后读取适当大小的块。
我编写了以下函数来进行 ASCII 到二进制的转换:
template<typename RealType=float>
void ascii_to_binary(const std::string& fsrc, const std::string& fdst){
RealType value;
std::fstream src(fsrc.c_str(), std::fstream::in | std::fstream::binary);
std::fstream dst(fdst.c_str(), std::fstream::out | std::fstream::binary);
while(src >> value){
dst.write((char*)&value, sizeof(RealType));
}
// RAII closes both files
}
我想加快速度acii_to_binary
,但我似乎无法提出任何建议。我尝试以 8192 字节的块读取文件,然后尝试在另一个子例程中处理缓冲区。这似乎很复杂,因为缓冲区中的最后几个字符可能是空格(在这种情况下一切都很好),或者是一个截断的数字(这非常糟糕)——处理可能的截断的逻辑似乎不值得。
你会怎么做来加速这个功能?我宁愿依赖标准 C++(C++11 也可以),没有额外的依赖,比如 boost。
谢谢你。
编辑:
@大卫施瓦茨:
我尝试按如下方式实施您的建议:
template<typename RealType=float>
void ascii_to_binary(const std::string& fsrc, const std::string& fdst{
std::vector<RealType> buffer;
typedef typename std::vector<RealType>::iterator VectorIterator;
buffer.reserve(65536);
std::fstream src(fsrc, std::fstream::in | std::fstream::binary);
std::fstream dst(fdst, std::fstream::out | std::fstream::binary);
while(true){
size_t k = 0;
while(k<65536 && src >> buffer[k]) k++;
dst.write((char*)&buffer[0], buffer.size());
if(k<65536){
break;
}
}
}
但它似乎没有写入数据!我在做这个工作...