【发布时间】:2011-02-17 14:42:23
【问题描述】:
我写了这个简单的类,它为一般的输出操作提供缓冲:
template <typename T>
class WriteBuffer {
typedef void (&flush_t)(const T* values, const size_t size);
public:
WriteBuffer(size_t size, flush_t flush) : flush_(flush) {
v_.reserve(size);
}
~WriteBuffer() { flush(); }
void flush() {
if (v_.size() > 0) {
flush_(&v_[0], v_.size());
v_.clear();
}
}
void write(const T value) {
if (v_.size() == v_.capacity())
flush();
v_.push_back(value);
}
private:
vector<T> v_;
flush_t flush_;
};
(为简单起见,省略了错误检查。)以下示例程序:
void writeInt(const int* values, const size_t size) {
cout << "Writing buffer of size " << size << ": " << endl;
for (size_t i = 0; i < size; ++i)
cout << values[i] << ", ";
cout << endl;
}
int main(int argc, char* argv[]) {
WriteBuffer<int> buffer(5, writeInt);
for (size_t i = 0; i < 18; ++i)
buffer.write(i);
return 0;
}
然后生成以下输出:
大小为 5 的写入缓冲区:0, 1, 2, 3, 4, 大小为 5 的写入缓冲区:5、6、7、8、9、 大小为 5 的写入缓冲区:10、11、12、13、14、 大小为 3 的写入缓冲区:15、16、17、这个问题是否有任何标准/更好的解决方案,例如一些具有类似功能的 STL 容器/BOOST 类?谢谢!
附加问题:您更喜欢使用函数对象而不是函数引用flush_t?
编辑
我想为任何类型的T 和客户端提供的任何flush 操作使用这种缓冲(不仅是字符和输出流)。例如:
template <typename T>
void write(const T* values, const size_t size) {
...
H5Dwrite(..., values);
...
}
WriteBuffer<unsigned long> buffer(8192, write<unsigned long>);
将数据写入 HDF5 数据集。 (此处不解决 HDF5 数据类型。)
【问题讨论】:
-
您是否正在考虑选择内存数据库?
-
@DumbCoder:抱歉,我对 IMDB 几乎一无所知。我只需要将大量(按顺序生成的)数据写入 HDF5 文件,并且不想每次都调用
H5Dwrite()(测量缓冲写入性能不佳)。