我一直试图看看我是否可以在拥有许多小数据向量时优化案例.在我的用例中,可能有100,000多个这样的向量,因此向量存储的大小是至关重要的.每个可能有时只有1或2个元素,但在许多情况下可能会增大容量.
我已经尝试过使用一个简单的std :: vector但这非常慢,因为它在堆上分配N个小缓冲区会浪费内存并且在时间关键的环境中需要太长时间.有效地,矢量上的小缓冲区优化(SBO)看起来似乎是一个可行的解决方案.这意味着使用向量的内部(即堆栈)数据直到超过它,然后才需要使用堆.
我偶然发现了LLVM SmallVector,它似乎就是这样做的.然而,它似乎在LLVM框架中有很多依赖项,并且想知道Boost中是否存在类似的东西?可能有可能通过Boost实现执行SBO优化,但我在搜索中找不到对此的任何引用.我已经看到STL实现在技术上被禁止形成这种优化虽然由于一些关于迭代器的规则但是?
链接:LLVM SmallVector位于LLVM软件的内部源代码中.
我在 CI 自动化工作流程期间读取 git 存储库的标签时遇到问题。我不想创建完整克隆,因为这会产生大量开销,因此更愿意维护“浅克隆”,但以某种方式确定应用程序版本控制的标签。
使用案例
git clone ... --depth=1。git describe --tags版本信息嵌入到已编译的应用程序中预期结果
对于完整克隆,标签将报告如下:
> git describe --tags
v0.5.0-95-g7bbc323
Run Code Online (Sandbox Code Playgroud)
实际结果
CI 下的浅克隆的工作原理不一样:
> git describe --tags
fatal: No names found, cannot describe anything.
Run Code Online (Sandbox Code Playgroud)
解决方案思路
下面是一个示例程序,其中“Container”类需要通过基类指针存储“Items”列表。从 C++11/14 开始,自然的选择是在我的情况下使用 std::unique_ptr 和可变参数模板。
然而,作为新手,我无法理解如何以编译的方式将可变参数列表转换为 unique_ptr 向量的初始化列表。非常感谢您的帮助,因为到目前为止我在网上找不到任何可以帮助我解决这个问题的东西(尽管可能就在那里!)。
提前致谢:
// Example program
#include <iostream>
#include <string>
#include <memory>
#include <vector>
struct Item
{
};
struct Container
{
template<typename... Items>
Container( Items&&... items )
: items_( {std::make_unique<Items>(items)...} ) //<<TODO: How, VC compiler times out with this code!?
{
}
std::vector<std::unique_ptr<Item>> items_;
};
struct A : Item { A(float){} };
struct B : Item { };
struct C : B { C(float){} };
struct D : Item { D(float){} };
int main() …Run Code Online (Sandbox Code Playgroud) 首先。我对此有点陌生,所以如果我的条款不正确,我深表歉意。
我们正在做什么
我们在 S3 中已有二进制文件格式的文件(例如 Google Protocol Buffers),我们希望运行 ETL 作业来创建转换数据的数据湖,这些数据将使用 Amazon Redshift 或 Amazon Athena 进行访问。将来我们可能会通过 Kinesis 进行流传输。
我们面临的问题
我们正在考虑使用 AWSglue,但其支持的格式列表有限(CSV、Json、Parquet、Orc、Avro、Grok),并且在文档https://docs.aws 中未提供“自定义/其他”。 amazon.com/glue/latest/dg/aws-glue-programming-etl-format.html
想法
关键考虑因素
非常感谢您可能拥有的任何帮助或经验,特别是示例或现有用例,因为我不认为我们正在尝试做的事情与众不同......或者是吗?
目标是在空格处拆分字符串,但不拆分引号中的文本数据或将其与相邻文本分开.
输入实际上是一个包含值对列表的字符串.如果值值包含空格,则用引号括起来.我需要一个函数,它返回一个值对元素数组,如下例所示:
示例输入:
'a:0 b:1 moo:"foo bar"c:2'
预期结果:
a:0,b:1,moo:foo bar,c:2(长度为4的数组)
我已经检查过其他一些问题,但没有一个(我发现)似乎能解决我的问题.大多数似乎在引号内的空格处分开,或者将"moo:"和"foo bar"分成不同的部分.
克雷格,非常感谢任何帮助
我们以高数据速率通过 UART 串行发送数据,因此数据大小很重要。对于我们的数据,最优化的格式是 Int24,它可以简化为 C/C++ 下的 C 位域结构(GCC 编译器)以实现完美优化:
#pragma pack(push, 1)
struct Int24
{
int32_t value : 24;
};
#pragma pack(pop)
typedef std::array<Int24,32> ArrayOfInt24;
Run Code Online (Sandbox Code Playgroud)
这些数据与其他数据打包在一起,并在设备和云基础设施之间共享。基本上,我们需要在不同架构和编程语言的设备之间发送二进制序列化。我们希望使用基于模式的二进制序列化,例如 ProtoBuffers 或 FlatBuffers,以避免客户端代码需要自行处理二进制补码符号位处理的相应位移和恢复。即在非 C 语言中读取 24 位值需要以下内容:
bool isSigned = (_b2 & (byte)0x80) != 0; // Sign extend negative quantities
int32_t value = _b0 | (_b1 << 8) | (_b2 << 16) | (isSigned ? 0xFF : 0x00) << 24;
Run Code Online (Sandbox Code Playgroud)
如果尚不存在哪个(如果有)现有的二进制序列化库可以轻松修改以扩展对此的支持,因为我们愿意在这方面添加到任何开源项目中。