问题标签 [boost-iostreams]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何为读取和写入打开 boost iostream 内存映射
我是boost::iostream
内存映射文件的新手,我在理解这些类时遇到了一些困难。
我希望我的函数能够创建一个新的内存映射文件用于写入和读取。我的写作部分很成功,但我不知道如何读回这些值。
阅读文档,看起来参数和类mapped_file_params::mode
都被忽略了。mapped_file_source
mapped_file_sink
可能我想使用它,因为它是我想使用的流seekg
和read
.
如果这是不可能的,我还能使用什么?可以使用mapped_file_sink::data()
回读吗?
在我的代码下面
c++ - 使用 boost 将 gzip 压缩/解压缩到内存中
我会简短:我有这段代码:
它在这一行给出了一个错误:
错误是:
编译器会在std::back_inserter(_data)
boost 的错误中一次两次地抛出这个错误。
提前致谢。
c++ - boost::iostreams::source 中的读取函数实际上是如何工作的?
我正在研究 boost::iostreams,我正在尝试编写自己的源设备。我写了两个版本的 boost::source。在第一个版本中,我只是简单地将时间字符串复制到 s 中,它就起作用了。但是在第二个版本中,我复制了一个特定的字符串,它就不行了,当我在这里下断点的时候,我发现它是一个圆圈。
这是测试。
版本 1:输出正确,版本 2:死循环。
所以我真的很困惑,“读取”调用中的工作流程是什么?
我浏览了 boost::iostreams 的手册。我发现的例子有点复杂,在我看来,这些例子所做的就是将几个成员添加到设备类中。它似乎不需要基本功能,因为我的版本 1 正在正确运行。
c++ - 在 Windows 上使用 zlib 编译 boost
是否有关于如何在 Windows 上使用 zlib 编译 boost 的好教程。我查看了 boost 参考,但它含糊不清,还不够。我确实下载了 zlib dll 和源代码,并在 Visual Studio 中进行了参考。我有链接错误
完整代码:
我收到此错误,
错误 11 错误 LNK2019:无法解析的外部符号“_declspec(dllimport) public: __thiscall boost::iostreams::detail::gzip_header::~gzip_header(void)”(__imp??1gzip_header@detail@iostreams@boost@@QAE@XZ ) 在函数 "public: __thiscall boost::iostreams::basic_gzip_decompressor \>::~basic_gzip_decompressor >(void)" (??1?$basic_gzip_decompressor@V?$allocator@D@std@@@iostreams@boost@@ QAE@XZ) –</p>
linux - 使用 boost::iostreams::mapped_file
我对内存映射非常陌生,并试图了解内存映射文件以在我的项目(基于 Linux)中使用它们。我的要求是写入然后从内存映射文件中读取。我写了一个示例程序,它只写并且工作正常,但我有一些非常基本的疑问,因为我不理解这个内存映射的基础。
我在这里有几个问题:
当我这样做时: mf.open(params) ,我看到在磁盘上创建了一个大小为 100 的文件。现在当我写入它时,即 *w = w1,磁盘上文件的内容发生了变化。这是否意味着我根本没有使用 RAM,而是直接写入
磁盘?当我执行 mf.size() 时,它总是给我作为创建实际文件的输入的大小。如何找出我实际写入
内存映射文件的数据大小?此外,如果我给 params.new_file_size = 10GB,该大小的文件会在
磁盘上创建,但不会占用任何磁盘空间。使用 df cmd 确认。为什么这样?-rwx-----。1 根 10000000000 Apr 29 14:26 map.dat我读到关闭文件释放了映射。这是否意味着关闭后我会丢失我写的所有数据?但这不是真的,因为我有工作代码,我关闭然后再次打开文件并正确读取它。
如何删除使用后创建的内存映射文件?通过使用 rm -rf cmd/linux api?
c++ - 使用 boost::iostreams::mapped_file 时的内存使用情况
我在这里粘贴一些代码,它使用 boost iostream 来映射然后写入映射文件:
当我在具有 8 个处理器和 16GB RAM 的 centos 6 机器上执行此操作时,我观察到以下情况:
当数据被插入内存映射文件时,RES(来自 top 命令)不断增加,直到 14GB。我的印象是,当我映射文件时,VIRT 会增加而不是 RES。那么,当我们写入 mmap 文件时,是不是先将其写入内存,然后再提交到磁盘?或者是否使用了任何中间缓冲区/缓存?
在“free”命令的帮助下,我还观察到内存使用量达到 16GB 后,会使用缓冲区。以下是上述代码执行时不同时间的 free 命令的一些快照:
这种行为意味着什么?
与写入内存相比,将数据写入内存映射文件需要花费大量时间。这是什么原因?
在处理大量数据时,我想使用内存映射来降低 RES 的使用。但它似乎不是那样工作的。想要将所有数据保存在内存映射文件中,并在需要时将它们读回。
我是否错误地使用了内存映射?或者这就是它的行为方式?
c++ - 如何在 Boost::Log 中使用压缩器 Boost::Iostreams 过滤器作为接收器
我正在尝试通过使用boost::iostreams::gzip_compressor
. 因此,当我调用时BOOST_LOG()
,输出会即时压缩。这是我到目前为止所尝试的:
我觉得我应该以某种方式 1) 将整个 filtering_ostream 作为接收器,而不仅仅是file
或
2)以某种方式推动记录器接收器而不是file
在filtering_ostream
.
有人可以指出我正确的方向吗?谢谢!
c++ - 为每一行调用回调的 std::ostream
我正在尝试编写一个自定义std::ostream
,它为写入它的每一行调用一个函数。也就是说,我希望以下代码能够按照注释中的说明工作:
请注意,数据不会写入任何地方,也不会存储在任何地方。我需要流存储的唯一内容是正在聚合的当前行,直到我们遇到行尾。
即使使用 boost.Iostreams 库,我也没有找到任何简单的方法。我可以通过使用 STL 和 Boost 的一些内置工具来避免在这里编写自己的行标记器吗?
背景
该类my_output_stream
将用于在我的应用程序中使用的外部库和日志库之间进行调整。外部库要求我提供一个 std::ostream。我想使用我的应用程序的日志框架记录外部库记录的每一行。
c++ - 读取过滤器链时如何禁用 boost::iostreams 缓冲区
我有一些看起来像这样的代码:
我已经有存储结果长度的元数据:
通过添加跟踪点,我观察到 Lz4 和 Aes 过滤器只能读取 128 个字节。此外,如果我file_source
用自定义设备替换,它只能读取 4096 字节。
由于我确切地知道读取应该具有的大小,有没有办法完全禁用 iostreams 中的缓冲并将读取链接到过滤器?我知道我可以更改缓冲区大小,但我有兴趣完全禁用它们。
c++ - 使用 Boost::iostreams 两用过滤器
我试图遵循 Boost::iostreams 文档中的有限状态过滤器示例。但是当我去使用过滤器时,我收到一条错误消息,指出 ::imbue 无法访问,因为 'boost::iostreams::detail::finite_state_filter_impl' 使用 'protected' 从 'my_fsm' 继承。
沮丧的是,我将我的代码复制到了用于 boost 示例的测试中。测试编译并通过。我的结论是我可能误用了由以下定义的双重用途过滤器:
typedef io::finite_state_filter my_fsm_filter;
我觉得只是将它推到过滤流上可能不合适,但我找不到缺失的步骤。我确信必须需要包装过滤器,但我找不到任何示例(尽管我确信如果我对用于测试 boost 代码的代码进行了足够深入的研究,它必须在某个地方)。
这是一些示例代码: