首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有预先分配内存的日志模块

具有预先分配内存的日志模块
EN

Stack Overflow用户
提问于 2017-02-10 21:59:12
回答 1查看 47关注 0票数 0

我正在编写一个日志机制,其馀代码将用于将字母数字数据记录到文件中。系统中的每个其他模块都将发送字母数字句子(最多几个单词),以便连续写入文件。问题是,我只得到了一小部分预先分配的内存,用于数据结构和这些日志消息的内存存储。如果流入大于可以写入磁盘的内容,则日志消息将被丢弃。

我想在我的日志模块中的客户端和内存存储之间设置一个压缩机制,这样我就可以保存尽可能多的消息。

我目前的设计是:

客户机

写线程:当它的时间写,切换缓冲区1与缓冲区2和写缓冲区1到文件。在此期间,客户端将写入缓冲区2。

外部脚本:解压缩并显示日志消息

问:什么是好的字母数字压缩算法,我可以使用一个好的数据结构,以捕获尽可能多的数据(在上面的压缩阶段)?

如果可能的话,我想要一种不将压缩代码存储在中间数据结构中的算法--也就是说,如果系统崩溃,我希望能够解压缩到目前为止已经写好的文件。

尝试到目前为止:给我们将要使用的每一个牧师分配一个代码。看上去不那么灵活。

大多数日志消息都是简单的文本句子。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-12 00:44:08

问:什么是好的字母数字压缩算法,我可以使用一个好的数据结构,以捕获尽可能多的数据(在上面的压缩阶段)?

一般来说,算法速度越慢,内存消耗越大,压缩比就越好。不同的编解码器做出不同的权衡,即使在某些编解码器中,也可以调整不同的参数以产生不同的权衡。

编解码器对于不同的数据也往往表现得非常不同。有几个基准测试,但这只会让您对性能有一个大致的了解;要真正选择最好的基准,您需要使用数据测试它们,并进行您自己的度量。

为了避免进程崩溃时的数据丢失,使用当前的设计,您需要的是一个支持刷新的流编解码器。每次您完成一条消息的日志记录时,您都需要告诉编解码器刷新。这方面的API将取决于编解码器,但通常您最终会得到以下内容

代码语言:javascript
运行
复制
foo_compress(stream, output, input);
foo_flush(stream);
fwrite(stream->output, 1, stream->output_size, file);
fflush(stream);

一些库为磁盘的读写提供了一个API (允许您跳过fwrite/fflush)。我想到了南瓜、gzip和lzham,但可能还有其他的。不过,在大多数情况下,库只是压缩到缓冲区,而您负责将缓冲区写入文件。

你的主要障碍是很多算法都不支持冲水。在我的头顶上,gzip,lzham,brotli,bzip2,lzma,zstd,我认为lz4f支持冲水。如果您进行了大量的刷新,那么bzip2的性能可能不会很好,而且如果这是一个新的系统,那么使用gzip或lzma的理由可能不多(zstd的性能优于gzip,brotli和lzham几乎在各方面都优于lzma )。

尽管如此,如果您只是试图避免由于代码中的崩溃而导致的数据丢失(也就是说,您希望在程序崩溃时保留数据,但您并不太担心操作系统崩溃),那么您可能需要考虑将压缩和I/O代码拆分到一个单独的进程中。此时,您将得到类似于syslog的东西,或者更新的结构化日志API (如日记ASL或令人吃惊的不愉快的Windows事件日志 API)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42169350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档