小编use*_*791的帖子

在CosmosDb中使用/ id作为分区键的含义

在每分钟有1000个条目(唯一键)输入波斯菊的情况下,使用/ id作为分区键是否安全?

特别是,存在逻辑分区的概念 https://docs.microsoft.com/zh-cn/azure/cosmos-db/partition-data 此处的图形使我有些害怕,表明逻辑分区是实际实体(例如,“城市”:“伦敦”)。如果我有一个8小时的TTL和每分钟1000个条目,那么我并不一定想要cosmos需要管理的480,000个逻辑分区。

我想像的是,分区键的值只是简单地经过哈希处理,并且与物理分区的数量成模,例如。 https://docs.microsoft.com/zh-cn/azure/cosmos-db/partitioning-overview#choose-partitionkey 在“逻辑分区管理”部分中表示这是正确的。此外,“选择分区密钥”部分建议(但实际上并未声明)/ id将是一个很棒的分区密钥,因为它不必担心10GB的限制,吞吐量限制,没有热点,宽(巨大的)值范围,并且由于应用程序不需要对除id以外的任何内容进行过滤,因此跨分区查询将不会成为该用例的问题。

总而言之,我是否需要担心成千上万个分区键值(逻辑分区)的内存/ CPU /等开销?文档指出分区键的值越多越好,但是不要说是否有太多的值。

azure azure-cosmosdb

7
推荐指数
2
解决办法
2096
查看次数

除非指定参数类型,否则Java无法编译通用lambda参数

在测试时,我将Junit升级到5.0(从而用新版本替换了一些assertTrue()方法)。这样做之后,我发现我的测试之一没有编译。我将问题简化为没有junit或其他依赖项的普通Java。结果是以下代码无法编译:

  public static void recreate() {
    // This does NOT work
    Recreation.assertTrue(identity((x) -> Boolean.TRUE)); 
    // This DOES work
    Recreation.assertTrue(identity((String x) -> Boolean.TRUE)); 
  }

  private static class Recreation {
    public static void assertTrue(boolean b) {
      System.out.println("boolean argument: " + b);
    }

    // If this method is removed, the code will compile. 
    public static void assertTrue(Supplier<Boolean> booleanSupplier) {
      System.out.println("supplier argument: " + booleanSupplier.toString());
    }
  }

  private static <K> K identity(Function<String, K> function) {
    return function.apply("hello");
  }
Run Code Online (Sandbox Code Playgroud)

如以上示例所示,如果满足以下任一条件,则代码将编译:

  1. 指定了lambda参数类型

  2. 重载的as​​sertTrue(Supplier booleanSupplier)方法已删除

这是类型推断/擦除的问题,还是这里发生了什么?

生成错误: …

java generics type-inference

7
推荐指数
1
解决办法
161
查看次数

将64位整数中的每个其他位与32位整数进行比较

我正在玩弄创建一个小的跳棋解算器的想法.首先,我将制作一个非常紧凑的跳棋板表示,然后继续构建游戏树等.

标准的检查板有8行,4个功能列(检查器只能移动对角线).这给了我们32个职位!每个位置需要的信息... 3位king位,和color位...所以00无王黑,01无王冲,10王黑,11王冲.这给了我们64这是一个很好的数字(长整数的精确大小).

但是,每个检查器还需要一个额外的位...该isOccupied位,因为每个检查器位置可以为空,或者填充上述四种状态之一.我决定采用64个状态并将它们放入一个长64位int,并将32个占用状态并将它们放入一个32位整数.

所以现在我们有一些背景知识,我有以下问题:我想轻易说"这块板上有多少个红色检查器?" 那不是那么糟糕......我们的64位整数包含这样的数据:

king_color_king_color_king_color所以011001意味着我们有红色,黑色的国王,红色.

为了得到颜色信息,我们可以使用01010101 ... 01的位掩码,它是十六进制的0x5555555555555555.这会将国王的位置归零,只留下颜色位.因此,在使用掩码进行AND运算后的011001示例中,我们有010001.如果我们计算位数(popcount,bitcount),我们得到红色数...

啊,等等!这些颜色可能不是"使用中".我们必须检查我们的32位int以查看是否正在使用给定的检查器!所以说我们已经为我们占用的32个整数设置了011 ...这意味着第一个检查器,上面的01(红色非国王)......实际上没有被占用...它只是一个空方块.如果我们要在那里移动另一个检查器,我们可能需要或不需要更新这两个王色位.所以把它们放在一起

32bit = 011
64bit = 011001
Run Code Online (Sandbox Code Playgroud)

代表3个检查员职位......一个空的检查员之前是红色的,接着是黑色的国王,接着是红色.一旦我们在64位上执行010101掩码操作,我们得到:

64bitWithMask = 010001
32bit=011
Run Code Online (Sandbox Code Playgroud)

天真的我们有2个红色...但我们实际上只有1个活动...我想要做的主要是采用64位字符串中的奇数位,并将它们与32位字符串中的每个位进行对比...即

1 AND 0, 0 AND 1, 1 AND 1 给我们001代表红色检查器的数量.

或者等效地,转换64bitWithMask64bitWithMaskOddBits = 101 Then然后简单地用32位得到011 & 101 = 001. …

c++ bit-manipulation bit-shift

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