c ++ - 实现部分写入压缩数据的存储编写器

时间:2013-12-19 10:18:45

标签: c++ zlib ofstream

在我的代码中,我有两种类型的编写器:常规编写器,类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()是我的计划的瓶颈。它被称为无数次,并负责写入许多千兆字节的数据。

问题
我需要在//TBD中实施StorageWriter::write().部分 我想在WriterZlibWriter之间进行“切换”的简单方法。

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

建议2

  1. 动态创建类ZlibWriter的实例(或甚至作为StorageWriter的成员)。
  2. ZlibWriter流移至位置等级Writer的位置。
  3. 使用ZlibWriter
  4. 写入数据
  5. Writer的位置移至文件末尾。
  6. 不确定将两个直播流发送到同一个文件是明智的。此外,所有这些寻求操作在该计划的关键部分都不是非常有效。



    非常感谢你的时间。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我不确定你在寻找什么(你总是写一个文件,或者每个作者都写自己的文件?)但是将两个作者都作为成员变量完全没问题。 你甚至可以拥有一个写作者的向量。所以创建一个所有编写器都包含的抽象接口,以便您可以遍历向量并简单地使用您的数据调用write()函数。编写器本身将处理写入,因此zlib编写器将压缩数据然后编写它,而不必担心任何事情:)

如果你需要在它们之间切换,你可以为你的zlibwriter添加一个单独的成员变量,在else的情况下用zlibwriter写下压缩的数据。

加速进程的一个想法是在编写器之间共享文件,因为一次只有一个进程会写入它,如果你将文件移到编写器之外,并给两个编写者一个引用它,你可以处理来自编写者的搜索等,这意味着下一个编写者可以只写,而不必进行不必要的文件操作。