实现部分写入压缩数据的存储写入程序
implement storage writer that partially writes compressed data
在我的代码中,我有两种类型的编写器:常规编写器,类Writer
和压缩编写器,类别ZlibWriter
。我需要一种将两位作家结合起来的方法
请查看下面的代码。很抱歉它有点太长了。我试着只发布非常相关的内容。
typedef std::vector<int> int_vector;
class Writer
{
public:
void open(string path);
void close();
void write(string v);
void write(bool v);
void write(int v);
void write(int_vector v);
private:
std::ofstream m_fstream; ///< file output stream
};
class ZlibWriter
{
public:
void open();
void close();
void write(int v);
void write(int_vector v);
private:
ozstream m_zstream; ///< ozstream is a wrapper class that extends ofstream and compress data using zlib format prior to writing
};
class Storage
{
public:
string m_name;
bool m_compressed;
int_vector m_data;
};
class StorageWriter
{
public:
void init(string path)
{
m_writer.open(path)
}
void write(const Storage& p)
{
m_writer.write(p.m_name);
m_writer.write(p.m_compressed);
if( !p.m_compressed )
m_writer.write(p.m_data);
else
{
// TBD - how to use ZlibWriter here?
}
}
private:
Writer m_writer;
};
约束StorageWriter::write()
是我的程序的瓶颈。它被调用无数次,负责写入数千GB的数据。
问题
我需要在StorageWriter::write().
中实现//TBD
部分。我想有一种在Writer
和ZlibWriter
之间"切换"的简单方法。
建议1
不要使用ZlibWriter
。每次需要压缩数据时,只需将其压缩为临时变量,然后将其写入文件即可
我不喜欢这样,因为这会使我重复ZlibWriter
类中已经实现的整个压缩机制。
建议2
- 动态创建类
ZlibWriter
的实例(甚至作为StorageWriter
的成员) - 将CCD_ 12流的位置移动到CCD_
- 使用CCD_ 14写入数据
- 将
Writer
的位置移动到文件的末尾
不确定将两个实时流传输到同一个文件是否明智。此外,所有这些寻道操作在程序的关键部分都不是很有效。
非常感谢您抽出时间。
您可以重载ZlibWriter
ctor,这样您就可以提供编写器将要写入的自定义流。使用std::ostream::rdbuf
将输出缓冲区替换为另一个流的输出缓冲区。
我不太确定你在寻找什么(你总是写一个文件,还是每个编写器都写自己的文件?)但将两个编写器都作为成员变量是完全可以的。你甚至可以拥有一个作家的载体。因此,创建一个所有编写器都包含的抽象接口,这样您就可以在向量上循环,并简单地用数据调用write()函数。编写器本身将处理写入,因此zlib编写器将压缩数据,然后进行写入,而不必担心任何事情:)
如果需要在它们之间切换,只需为zlibwriter添加一个单独的成员变量,在其他情况下,使用zlibwriter编写压缩数据。
加快进程的一个想法是在写入程序之间共享文件,因为一次只有一个进程会写入文件,如果你将文件移动到写入程序之外,并给两个写入程序一个引用,你可以处理写入程序的seek etc,这意味着下一个写入程序可以直接写入,而不必执行不必要的文件操作。
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 用于创建/注册虚拟存储设备的 IOKit 驱动程序
- shared_ptr的删除程序是否存储在自定义分配器分配的内存中?
- 如果静态变量只为程序的整个部分存储了一个副本,为什么我不能使用静态变量交换 2 个数字?
- 引发未经处理的异常:简单 C++ 程序中的读取访问冲突,动态增加数组长度以存储数字
- 我在一个生成随机数的程序工作,我想将这些数字存储在一个数组中
- 安卓中的Qt和应用程序数据存储
- 如何制作一个结构程序,在其中可以存储无限量的数据,以便每次您想要时都可以将另一个产品添加到列表中?
- Visual样本存储过程从C 程序执行
- QT MAC应用程序存储数据路径
- 如何制作一个为程序的每个运行中存储不同数据类型的向量
- 将大量数据从C 应用程序传递到SQLServer存储过程的最快方法是什么?
- 当分配动态内存以存储字符串副本时,程序会中断
- 为什么字符串变量"sum"不存储任何数据,程序不给出任何输出
- 如何检查程序是否超过数据类型存储
- C++ Mongocxx驱动程序存储的JavaScript问题
- 如何将JSON数组存储在Arduino程序中
- C 程序要读取包含两个双重值的Excel数据的单列,这些值由逗号分隔并存储在自己的数组中
- 应用程序使用QMAP存储对象时停止响应
- 在运行时存储程序的机器指令的位置