海量数据流的通缩压缩算法
Deflation compression algorithm for huge data streams
我的 C++ 程序时不时地获取数据缓冲区,应该将其添加到现有的压缩文件中。
我试图通过从某个文件中读取 1k 块,将它们传递到压缩流并在数据结束时解压缩来制作 POC。
我使用 Poco::DeflatingOutputStream 将每个块压缩到文件中,并使用 Poco::InflatingOutputStream 来检查解压后是否得到原始文件。
然而,似乎在解压缩流后我的数据几乎与原始文件相同,除了在每 2 个连续的数据块之间我得到一些垃圾字符,例如:à¿_ÿ
这是一个被分成 2 个块的行的示例。原始行看起来像这样:
elevated=0 path=/System/Library/CoreServices/Dock.app/Contents/MacOS/Dock exist
而解压行是:
elevated=0 path=/System/Libr à¿_ÿary/CoreServices/Dock.app/Contents/MacOS/Dock exist
5 月 19 日 19:12:51 PANMMUZNG8WNREM 内核[0]:pid=904 uid=1873876126 sbit=0
知道我做错了什么。这是我的 POC 代码:
int zip_unzip() {
std::ostringstream stream1;
Poco::DeflatingOutputStream gzipper(stream1, Poco::DeflatingStreamBuf::STREAM_ZLIB);
std::ifstream bigFile("/tmp/in.log");
constexpr size_t bufferSize = 1024;
char buffer[bufferSize];
while (bigFile) {
bigFile.read(buffer, bufferSize);
gzipper << buffer;
}
gzipper.close();
std::string zipped_string = stream1.str();
//////////////////
std::ofstream stream2("/tmp/out.log", std::ios::binary);
Poco::InflatingOutputStream gunzipper(stream2, InflatingStreamBuf::STREAM_ZLIB);
gunzipper << zipped_string;
gunzipper.close();
return 0;
}
好的,我刚刚意识到我在每次从 HugeFile(原始解压缩文件)读取时都使用了“<<”运算符,因为每个 window 我从文件中读取。
这是固定版本:
#include <stdio.h>
#include <fstream>
#include <Poco/DeflatingStream.h>
#include <Poco/Exception.h>
#include <iostream>
int BetterZip()
{
try {
// Create gzip file.
std::ofstream output_file("/tmp/out.gz", std::ios::binary);
Poco::DeflatingOutputStream output_stream(output_file, Poco::DeflatingStreamBuf::STREAM_GZIP);
// INPUT
std::ifstream big_file("/tmp/hugeFile");
constexpr size_t ReadBufferSize = 1024;
char buffer[ReadBufferSize];
while (big_file) {
big_file.read(buffer, ReadBufferSize);
output_stream.write(buffer, big_file.gcount());
}
output_stream.close();
} catch (const Poco::Exception& ex) {
std::cout << "Error : (error code " << ex.code() << " (" << ex.displayText() << ")";
return EINVAL;
}
return 0;
}
我的 C++ 程序时不时地获取数据缓冲区,应该将其添加到现有的压缩文件中。
我试图通过从某个文件中读取 1k 块,将它们传递到压缩流并在数据结束时解压缩来制作 POC。
我使用 Poco::DeflatingOutputStream 将每个块压缩到文件中,并使用 Poco::InflatingOutputStream 来检查解压后是否得到原始文件。
然而,似乎在解压缩流后我的数据几乎与原始文件相同,除了在每 2 个连续的数据块之间我得到一些垃圾字符,例如:à¿_ÿ
这是一个被分成 2 个块的行的示例。原始行看起来像这样:
elevated=0 path=/System/Library/CoreServices/Dock.app/Contents/MacOS/Dock exist
而解压行是:
elevated=0 path=/System/Libr à¿_ÿary/CoreServices/Dock.app/Contents/MacOS/Dock exist
5 月 19 日 19:12:51 PANMMUZNG8WNREM 内核[0]:pid=904 uid=1873876126 sbit=0
知道我做错了什么。这是我的 POC 代码:
int zip_unzip() {
std::ostringstream stream1;
Poco::DeflatingOutputStream gzipper(stream1, Poco::DeflatingStreamBuf::STREAM_ZLIB);
std::ifstream bigFile("/tmp/in.log");
constexpr size_t bufferSize = 1024;
char buffer[bufferSize];
while (bigFile) {
bigFile.read(buffer, bufferSize);
gzipper << buffer;
}
gzipper.close();
std::string zipped_string = stream1.str();
//////////////////
std::ofstream stream2("/tmp/out.log", std::ios::binary);
Poco::InflatingOutputStream gunzipper(stream2, InflatingStreamBuf::STREAM_ZLIB);
gunzipper << zipped_string;
gunzipper.close();
return 0;
}
好的,我刚刚意识到我在每次从 HugeFile(原始解压缩文件)读取时都使用了“<<”运算符,因为每个 window 我从文件中读取。
这是固定版本:
#include <stdio.h>
#include <fstream>
#include <Poco/DeflatingStream.h>
#include <Poco/Exception.h>
#include <iostream>
int BetterZip()
{
try {
// Create gzip file.
std::ofstream output_file("/tmp/out.gz", std::ios::binary);
Poco::DeflatingOutputStream output_stream(output_file, Poco::DeflatingStreamBuf::STREAM_GZIP);
// INPUT
std::ifstream big_file("/tmp/hugeFile");
constexpr size_t ReadBufferSize = 1024;
char buffer[ReadBufferSize];
while (big_file) {
big_file.read(buffer, ReadBufferSize);
output_stream.write(buffer, big_file.gcount());
}
output_stream.close();
} catch (const Poco::Exception& ex) {
std::cout << "Error : (error code " << ex.code() << " (" << ex.displayText() << ")";
return EINVAL;
}
return 0;
}