5

我有一个在客户端之间共享的活动队列,捕获用户活动并由另一个站点上的机器人执行。活动的一个例子可能是:

CREATE FOLDER  /docs
CREATE FILE    /docs/journal.txt
DELETE FILE    /docs/blog.txt
MOVE   FOLDER  /docs/images /docs/photos
...

通常有一些活动可以简化为一个,或者没有。例如:

CREATE FOLDER /docs
RENAME FOLDER /docs /documents

可以简单地改为:

CREATE FOLDER /documents

和类似的东西:

CREATE FOLDER /docs
RENAME FOLDER /documents
DELETE FOLDER /documents

可以完全从队列中移除。

这种减少/优化似乎是一个非常普遍的问题,在攻击它之前,我想尝试一些通用的解决方案。它看起来像一个寻路优化问题。

有任何想法吗?

4

3 回答 3

3

我不知道有任何库或框架可以为您做到这一点。另一方面,您必须自己指定其背后的逻辑,而在我看来,这将是大部分工作。

这是我将采取的方法:

  1. 对操作进行拓扑排序(重命名文件夹“取决于”创建文件夹等等......)

  2. 每个没有依赖关系的命令都代表依赖关系树中的一个“根”。

  3. 从每个根开始递归地折叠这些树。

于 2012-05-31T22:04:45.020 回答
1

一种选择(尽管有点重量级)是遍历队列记录并在您在程序中创建的树表示上模拟在文件系统上执行的操作。对于引用的每个目录,您可以跟踪最终在其上执行的网络操作。完成后,您可以遍历修改后的树结构并输出一系列命令,这些命令表示应用于每个目录和子目录的网络转换。

希望这可以帮助!

于 2012-05-31T22:24:18.507 回答
0
  1. 定义所有操作(创建、重命名、移动)
  2. 定义一个包含您的操作 + 操作参数的 Command 类。
  3. 实现一些东西,它会告诉你两个命令是否可以组合,以及组合的结果是什么。

我必须假设您只能组合紧随其后的命令,否则您可能会引入不需要的副作用。因此,当您从 yoru 队列中执行命令时,请开始查看/弹出/构建命令,直到遇到无法组合到其中的命令。

于 2012-05-31T22:44:56.857 回答