所以,不久前我读了一个像这样的笑话:
"永远不要用二进制来计算pi - 因为它无限地进行并且是随机的,它理论上包含每个有限的位串.因此,你将拥有所有受版权保护的材料,并承担一些严重的罚款."
这显然是幽默的,但它让我思考.如果每个有限位串都存在于pi的二进制表示中,是否可以将其用作传输数据的方法?
例如,假设我想传输一个可以解释为jpeg图像的位字符串.我不是直接发送信息,而是在pi的数字内找到它的位置,并简单地发送pi数字中第一位的位置,以及字符串的长度.
这对我来说似乎很简单,但这里显而易见的问题是,即使是前几万亿个数字内找到这个字符串的概率也非常小.因此,最终可能需要花费大量时间才能找到.
我的想法是,几台机器可以专门用于在pi中搜索大文件,然后创建所有起始位置的索引.因此,每次计算只需要发生一次,然后从那时起可以非常快速地传输该信息.
所以你怎么看?这完全可行,还是这些计算需要花费太多时间?
谢谢阅读!如果我忽略了任何发布指南,我会道歉,如果我在这个论坛中提出第一个问题.
编辑:
感谢您的快速回复,伙计们!我认为我的推理有错误,很高兴知道为什么!
我们试图在Apache Beam管道上使用固定窗口(使用DirectRunner).我们的流程如下:
CombineFn,将每个Events 窗口组合成一个List<Event>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) 我们正在使用Apache Beam和DirectRunner作为跑步者构建管道.我们目前正在尝试一个简单的管道,我们:
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
我们正在为Apache Beam管道构建集成测试,并且遇到了一些问题.有关背景信息,请参见
有关我们管道的详情:
PubsubIO我们的数据源(无界PCollection)CombineFn和非常简单的窗口/触发策略JdbcIO,用org.neo4j.jdbc.Driver写的Neo4j目前的测试方法:
OurPipeline.main(TestPipeline.convertToArgs(options)PubsubIO将从这是一个简单的集成测试,它将验证我们的整个管道是否按预期运行.
我们目前面临的问题是,当我们运行我们的管道时,它会阻塞.我们正在使用DirectRunner和pipeline.run()(不 pipeline.run().waitUntilFinish()),但测试似乎在运行管道后挂起.因为这是一个无限制的PCollection(在流模式下运行),管道不会终止,因此不会到达它之后的任何代码.
所以,我有几个问题:
1)有没有办法运行管道然后稍后手动停止?
2)有没有办法异步运行管道?理想情况下,它会启动管道(然后将继续轮询Pub/Sub以获取数据),然后转到负责发布到Pub/Sub的代码.
3)这种集成测试方法是否合理,或者是否有更好的方法可能更直接?这里的任何信息/指导将不胜感激.
如果我能提供任何额外的代码/背景,请告诉我 - 谢谢!
java integration-testing google-cloud-pubsub google-cloud-dataflow apache-beam
我正在运行以下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子句之后如何继续进行查询?
提前致谢!