小编Chr*_*kos的帖子

可以在合理的时间内在pi中找到任何有限位串吗?

所以,不久前我读了一个像这样的笑话:

"永远不要用二进制来计算pi - 因为它无限地进行并且是随机的,它理论上包含每个有限的位串.因此,你将拥有所有受版权保护的材料,并承担一些严重的罚款."

这显然是幽默的,但它让我思考.如果每个有限位串都存在于pi的二进制表示中,是否可以将其用作传输数据的方法?

例如,假设我想传输一个可以解释为jpeg图像的位字符串.我不是直接发送信息,而是在pi的数字内找到它的位置,并简单地发送pi数字中第一位的位置,以及字符串的长度.

这对我来说似乎很简单,但这里显而易见的问题是,即使是前几万亿个数字内找到这个字符串的概率也非常小.因此,最终可能需要花费大量时间才能找到.

我的想法是,几台机器可以专门用于在pi中搜索大文件,然后创建所有起始位置的索引.因此,每次计算只需要发生一次,然后从那时起可以非常快速地传输该信息.

所以你怎么看?这完全可行,还是这些计算需要花费太多时间?

谢谢阅读!如果我忽略了任何发布指南,我会道歉,如果我在这个论坛中提出第一个问题.

编辑:

感谢您的快速回复,伙计们!我认为我的推理有错误,很高兴知道为什么!

algorithm complexity-theory pi communication

29
推荐指数
4
解决办法
3534
查看次数

使用Apache Beam进行窗口化 - 固定Windows似乎不会关闭?

我们试图在Apache Beam管道上使用固定窗口(使用DirectRunner).我们的流程如下:

  1. 从pub/sub中提取数据
  2. 将JSON反序列化为Java对象
  3. 窗口事件w /固定窗口5秒
  4. 使用自定义CombineFn,将每个Events 窗口组合成一个List<Event>
  5. 为了测试,只需输出结果 List<Event>

管道代码:

    pipeline
                // Read from pubsub topic to create unbounded PCollection
                .apply(PubsubIO
                    .<String>read()
                    .topic(options.getTopic())
                    .withCoder(StringUtf8Coder.of())
                )

                // Deserialize JSON into Event object
                .apply("ParseEvent", ParDo
                    .of(new ParseEventFn())
                )

                // Window events with a fixed window size of 5 seconds
                .apply("Window", Window
                    .<Event>into(FixedWindows
                        .of(Duration.standardSeconds(5))
                    )
                )

                // Group events by window
                .apply("CombineEvents", Combine
                    .globally(new CombineEventsFn())
                    .withoutDefaults()
                )

                // Log grouped events
                .apply("LogEvent", ParDo
                    .of(new LogEventFn()) …
Run Code Online (Sandbox Code Playgroud)

java google-cloud-dataflow apache-beam

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

编码器问题Apache Beam和CombineFn

我们正在使用Apache Beam和DirectRunner作为跑步者构建管道.我们目前正在尝试一个简单的管道,我们:

  1. 从Google Cloud Pub/Sub中提取数据(目前使用模拟器在本地运行)
  2. 反序列化为Java对象
  3. 使用固定窗口1分钟的窗口事件
  4. 使用自定义CombineFn将这些窗口从事件转换为事件列表来组合这些窗口.

管道代码:

pipeline
.apply(PubsubIO.<String>read().topic(options.getTopic()).withCoder(StringUtf8Coder.of()))

.apply("ParseEvent", ParDo.of(new ParseEventFn()))

.apply("WindowOneMinute",Window.<Event>into(FixedWindows.of(Duration.standardMinutes(1))))              

.apply("CombineEvents", Combine.globally(new CombineEventsFn()));
Run Code Online (Sandbox Code Playgroud)

ParseEvent函数:

    static class ParseEventFn extends DoFn<String, Event> {
        @ProcessElement
        public void processElement(ProcessContext c) {
            String json = c.element();
            c.output(gson.fromJson(json, Event.class));
        }
    }
Run Code Online (Sandbox Code Playgroud)

CombineEvents功能:

public static class CombineEventsFn extends CombineFn<Event, CombineEventsFn.Accum, EventListWrapper> {
        public static class Accum {
            EventListWrapper eventListWrapper = new EventListWrapper();
        }

        @Override
        public Accum createAccumulator() {
            return new Accum();
        }

        @Override
        public Accum addInput(Accum accumulator, Event …
Run Code Online (Sandbox Code Playgroud)

java google-cloud-platform google-cloud-dataflow apache-beam

8
推荐指数
2
解决办法
2864
查看次数

Apache Beam - 使用无界PCollection进行集成测试

我们正在为Apache Beam管道构建集成测试,并且遇到了一些问题.有关背景信息,请参见

有关我们管道的详情:

  • 我们使用PubsubIO我们的数据源(无界PCollection)
  • 中间变换包括自定义CombineFn和非常简单的窗口/触发策略
  • 我们最终的变换JdbcIO,用org.neo4j.jdbc.Driver写的Neo4j

目前的测试方法:

  • 在运行测试的计算机上运行Google Cloud的Pub/Sub模拟器
  • 构建内存中的Neo4j数据库并将其URI传递给我们的管道选项
  • 通过调用运行管道 OurPipeline.main(TestPipeline.convertToArgs(options)
  • 使用Google Cloud的Java Pub/Sub客户端库将消息发布到测试主题(使用Pub/Sub模拟器),该主题PubsubIO将从
  • 数据应该流经管道并最终命中我们的内存中的Neo4j实例
  • 在Neo4j中对这些数据的存在做出简单的断言

这是一个简单的集成测试,它将验证我们的整个管道是否按预期运行.

我们目前面临的问题是,当我们运行我们的管道时,它会阻塞.我们正在使用DirectRunnerpipeline.run()( pipeline.run().waitUntilFinish()),但测试似乎在运行管道后挂起.因为这是一个无限制的PCollection(在流模式下运行),管道不会终止,因此不会到达它之后的任何代码.

所以,我有几个问题:

1)有没有办法运行管道然后稍后手动停止?

2)有没有办法异步运行管道?理想情况下,它会启动管道(然后将继续轮询Pub/Sub以获取数据),然后转到负责发布到Pub/Sub的代码.

3)这种集成测试方法是否合理,或者是否有更好的方法可能更直接?这里的任何信息/指导将不胜感激.

如果我能提供任何额外的代码/背景,请告诉我 - 谢谢!

java integration-testing google-cloud-pubsub google-cloud-dataflow apache-beam

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

Neo4J / APOC-调用存储过程“ apoc.cypher.doIt”后无法建立查询

我正在运行以下Cypher查询:

WITH "CREATE (test:Test {id: 1})" AS cypher
CALL apoc.cypher.doIt(cypher, {}) YIELD value
CREATE (test2:Test2 {id: 2})
Run Code Online (Sandbox Code Playgroud)

之后,我运行MATCH (a) RETURN a并看到仅Test创建了一个带有标签的节点。第二条CREATE语句似乎没有运行。

如果我创建Test2 之前CALL,它创建节点如预期。

谁能解释为什么会这样,以及在此CALL子句之后如何继续进行查询?

提前致谢!

stored-procedures neo4j graph-databases cypher neo4j-apoc

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