实现部分写入压缩数据的存储写入程序

implement storage writer that partially writes compressed data

本文关键字:存储 程序 压缩 实现部 数据      更新时间:2023-10-16

在我的代码中,我有两种类型的编写器:常规编写器,类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部分。我想有一种在WriterZlibWriter之间"切换"的简单方法。

建议1
不要使用ZlibWriter。每次需要压缩数据时,只需将其压缩为临时变量,然后将其写入文件即可
我不喜欢这样,因为这会使我重复ZlibWriter类中已经实现的整个压缩机制。

建议2

  1. 动态创建类ZlibWriter的实例(甚至作为StorageWriter的成员)
  2. 将CCD_ 12流的位置移动到CCD_
  3. 使用CCD_ 14写入数据
  4. Writer的位置移动到文件的末尾

不确定将两个实时流传输到同一个文件是否明智。此外,所有这些寻道操作在程序的关键部分都不是很有效。



非常感谢您抽出时间。

您可以重载ZlibWriterctor,这样您就可以提供编写器将要写入的自定义流。使用std::ostream::rdbuf将输出缓冲区替换为另一个流的输出缓冲区。

我不太确定你在寻找什么(你总是写一个文件,还是每个编写器都写自己的文件?)但将两个编写器都作为成员变量是完全可以的。你甚至可以拥有一个作家的载体。因此,创建一个所有编写器都包含的抽象接口,这样您就可以在向量上循环,并简单地用数据调用write()函数。编写器本身将处理写入,因此zlib编写器将压缩数据,然后进行写入,而不必担心任何事情:)

如果需要在它们之间切换,只需为zlibwriter添加一个单独的成员变量,在其他情况下,使用zlibwriter编写压缩数据。

加快进程的一个想法是在写入程序之间共享文件,因为一次只有一个进程会写入文件,如果你将文件移动到写入程序之外,并给两个写入程序一个引用,你可以处理写入程序的seek etc,这意味着下一个写入程序可以直接写入,而不必执行不必要的文件操作。

相关文章: