- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须建立一个运动检测服务。运动检测不适用于视频,而仅适用于静止图像。
该微服务需要能够无序接收图像(带有时间戳)和 找出图像是否与之前拍摄的图像不同 (时间戳早于它)。将需要多个运动检测工作人员。
因此,关键要求似乎是:
最佳答案
具有多个生产者和多个消费者的图像队列在这里似乎是正确的方法。对于这个答案的其余部分,我将从这个队列的细节中抽象出来,因为这些细节取决于生产者和消费者的位置(物理上在哪台机器上)。
以下是在消费者端要做的事情:
暂时保留图片在内存中 在 hash table .键是时间戳,值是指向图像内容(以及您可能想要保留的任何元数据)的指针。一旦将图像与连续时间戳的图像进行比较,就可以将图像从哈希表中删除。
您的消费机器需要有足够的工作内存来存储图像。如果在给定的时间戳与其之前或之后的时间戳之间平均收到 100 张图像,并且图像的平均大小为 1MB,则这些图像总共将占用 100 * 2 * 1MB = 200MB 的内存。
创建第二个内存队列以跟踪尚无法比较的图像。如果在接收具有当前时间戳的图像时无法从哈希表中获得具有上一个时间戳的图像,则工作人员会将带有时间戳的图像指针放入该队列。第二组工作人员从这个队列中获取时间戳,并测试前一个时间戳的图像是否同时可用。如果是,则比较图像,否则将图像和时间戳推回到队列中。
第一组和第二组工作人员的相对大小应与其直接后继人员之前到达的图像的相对频率成正比。换句话说,如果图像有 60% 的时间在其直接后继者之前进入哈希表(因此图像在其直接后继者之后到达的时间为 40%),则 60% 的工作人员应该在第一组中,而 40%应该在第二组。或者,您可以根据需求动态地将工作人员分配给一个集合;如果无序行为往往波动很大,例如取决于一天中的时间,这可能是合适的。
具有单个消费者的第三个队列负责更新数据库。第三个队列可能跨网络也可能不跨网络,就像第一个队列一样。在前两组中的工作人员比较了两个连续的图像后,它将结果推送到第三个队列中。这个队列的消费者获取队列的内容并将它们同步到数据库。它可以通过每几个(比如 10 个)比较的一个事务来实现这一点,以最大限度地减少延迟,或者每秒将所有内容集中在一个事务中,以最大限度地提高吞吐量。不要为每个图像比较单独创建事务,这可能会比您想要的慢得多。
图像比较 worker 都需要读取和更新哈希表,因此您需要一种机制来防止竞争条件。在这种情况下,锁定机制是不合适的,因为它可能会成为您的应用程序的瓶颈。取而代之的是,让单个工作人员专门管理散列表,并让所有比较工作人员通过读取/插入队列向散列表管理器发送请求。由于管理器的工作相对较轻(存储、检索和删除图像指针),它应该能够在大多数时间保持在读取/插入队列的前面。
当一个worker发出一个读请求时,它会等待管理器的回复(而不是当它发出一个插入请求时)。它可能会传递回调和 sleep ,或者输入自旋锁检查共享变量的“回复就绪”值(取决于您的编程环境,这可能归结为相同的事情)。当然,您根本不想让您的工作人员等待,但大多数等待将非常短暂,而且这种方法肯定会比全局锁定方法更快。
在首次从哈希表中成功检索到图像后,管理器可以从表中删除该图像(因为只会请求该图像与后续图像进行比较)。管理器应该从哈希表中删除指针,而不是删除图像本身。您可以使用 reference counting以确定何时应从内存中完全清除图像。虽然引用计数需要锁定或原子化,但这不会成为瓶颈,因为在任何给定时间最多有两个工作人员访问图像,大多数情况下不会直接影响引用计数。
备注
在上面的设计中我没有讨论图像何时进入永久数据库。这很可能发生在生产者端,在图像进入第一个队列之前。或者,我讨论过的第三个队列中的数据库同步代理可能会这样做。您不想让您的比较 worker 或哈希表管理器承担此责任。
如果您认为我的回答很有希望,我愿意提供额外的文档,例如(极简)流程图、工作人员的伪代码算法或粗略的数据流流量配置文件。
关于architecture - 消息需要访问共享数据时的消息队列架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24944819/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!