小编Nei*_*eil的帖子

在MongoDB中快速搜索数十亿个小文档的策略

我需要存储数十亿个小数据结构(每个大约200个字节).到目前为止,将每个元素存储为单独的文档运行良好,Mongo每秒提供大约10,000个结果.我使用20字节哈希作为每个文档的_id,以及_id字段上的单个索引.在测试中,这适用于具有5,000,000个文档的数据集.

在操作中,我们将每秒发出大约10,000个请求,每秒更新现有文档大约1,000次,并且每秒插入新文档可能大约100次或更少.

当我们无法在RAM中存储整个索引时,我们如何管理更大的数据集?如果我们将几个元素组合到每个文档中,MongoDB会表现得更好 - 为了更快地搜索索引,但每个查询中返回的数据更多?

与SO上的其他问题不同,我不仅对我们可以填充到Mongo的数据感兴趣.它可以清楚地管理我们正在查看的数据量.我担心的是find,考虑到RAM的限制,我们如何才能最大限度地提高大型集合的操作速度.

我们的搜索将倾向于聚集; 大约50,000个元素将满足约50%的查询,但剩余的50%将随机分布在所有数据中.我们可以通过将这些50%移动到他们自己的集合中来获得性能提升,以便将最常用数据的较小索引保持在ram中吗?

将_id字段的大小从20字节减小到8字节会对MnogoDB的索引速度产生重大影响吗?

search scalability mongodb database-performance pymongo

19
推荐指数
1
解决办法
9999
查看次数

如何阻止g ++链接不需要的异常处理代码?

我正在使用为arm-eabi编译的GCC/G ++开发嵌入式应用程序.由于资源限制,我试图禁用标准C++异常处理.我正在使用"-fno-exceptions -nostartfiles -ffreestanding"编译代码.

当一个类的全局实例存在,并且该类包含另一个类的实例作为成员时,则链接了许多异常处理代码.这不会那么糟糕,除了它还带来了很多stdio的东西,比如printf,fopen,fclose和其他FILE函数.此应用程序没有文件系统,即使这样做,这些功能也会浪费太多代码空间.

我理解即使使用-fno-exceptions,G ++链接在使用异常的operator new中,因为库没有非异常使用的operator new(new(nothrow)除外).我为operator new和delete创建了替换,它们被链接到输出以及不需要的标准库函数.

令我困惑的是,我不会在任何地方打电话给新人.只有当一个全局对象包含另一个对象时才会链接所有这些代码.

例如:

class UartA {
...
private:
  Ringbuffer* rxbuf;
};

class UartB {
...
private:
  Ringbuffer rxbuf;
};
Run Code Online (Sandbox Code Playgroud)

如果创建了UartA的全局实例,则不会链接异常处理,operator new和stdio内容.这就是我想要的.

如果创建了UartB的全局实例(其中rxbuf是实例而不是指针),则链接不需要的代码.

UartA和UartB都不使用operator new,exception或stdio.它们的区别仅在于rxbuf的类型.

你能建议如何防止链接额外的代码吗?另外,为什么这与UartB相关联,而不是UartA?

c++ gcc g++ exception

5
推荐指数
2
解决办法
6894
查看次数

公共版本的Git rebase/merge

我一直在挖掘git merge和rebase docs,而且还有一些东西没有下沉.我正在Git中积极开展一个项目,需要与其他开发人员分享具体的里程碑.我希望在每个里程碑/版本中完全按照它共享代码,但不是所有我的小提交都会导致每个版本.

如何创建镜像开发分支的发布分支,其中发布分支上的提交每个都包含来自开发分支的多个提交? 换句话说,发布分支应该具有压缩历史记录,否则匹配开发分支.

最初,我曾想过使用单独的分支并使用git merge --squash会很有效,创建一个新的分支,其中包含一系列提交,这些提交反映了每个版本之间的全部更改.我现在明白git merge --squash不能用于重复使用.

Git rebase可以将多个提交折叠成一个大型提交,但是因为它改变了提交历史记录,不会改变我的私有历史记录以及公共版本吗?

我不想丢失我的小更改历史记录,但希望将组合提交推送到共享服务器.

git

5
推荐指数
1
解决办法
871
查看次数

如何从 if/else 语句切换到“for”循环?

所以目前我有一个命令列表,每个命令的执行方式如下:

if upp == "help":
        help()
    elif upp == "showdate":
        showdate()
    elif upp == "calculator":
        calculatorb()
    elif upp == "quit":
        quit()
    else:
        print(cmderror)
Run Code Online (Sandbox Code Playgroud)

它从列表中读取,例如:

cmds = {
        "help",
        "calculator",
        "showdate",
        "quit"
    }
Run Code Online (Sandbox Code Playgroud)

因此,如果用户输入的命令不在其中,cmds则会引发错误。

如何切换到for声明?

我做的第一件事就是做出一个决定:

cmds = {
        "help" : help(),
        "calculator": calculatorb(),
        "showdate" : showdate(),
        "quit" : quit()
    }
Run Code Online (Sandbox Code Playgroud)

但现在我无法执行该for声明。

for cmds_names, cmds in cmds.items():
        print("E")
Run Code Online (Sandbox Code Playgroud)

由于某种原因,所有命令都会按字典的顺序一次性执行。

python

0
推荐指数
1
解决办法
54
查看次数