1

我知道共享内存和进程间通信的基础知识,但由于我的应用程序相当具体,所以我问这个问题以获得一般反馈。

我正在使用 32 位可视化编码工具包在 64 位机器(MacOS 和 Win 64)上工作。目前将工具包移植到 64 位是不切实际的,所以我有内存限制。

我正在开发一个应用程序,该应用程序必须能够快速擦洗(根据用户输入来回移动)高质量视频。显而易见的解决方案是: 1 - 将其全部保存在内存中。2 - 从磁盘流式传输。目前将其全部放入内存需要将视频质量降低到不可接受的程度,并且从磁盘流式传输会导致擦除在加载时挂起。

我目前的思路是运行一个主程序和多个从属程序。每个从机将一段视频加载到内存中,当主程序需要加载视频的不同部分时,它会从从机请求这些数据并将其传输过来。

我的问题是,这样做的合适方法是什么?我怀疑共享内存不允许我超越我的应用程序当前的 32 位内存限制。我可以做一些像管道一样简单的事情,但我想知道是否还有其他更合适的东西。

理想情况下,这个解决方案应该是 Mac/Win 可移植的,但由于最终解决方案必须驻留在 Windows 盒子上,我将选择 Windows 解决方案。也越容易越好,因为我不想在这方面花费数周的开发时间。

先谢谢了。

4

2 回答 2

2

我猜您正在(或至少可以)使用具有 64 位操作系统的 64 位机器,即使将所有代码移植到 64 位是不切实际的。我还假设你的机器足够的内存来保存你关心的数据——真正的问题是从 32 位代码中获得足够的内存。

如果是这种情况,那么我会查看 Windows 的地址窗口扩展 (AWE) 函数,例如AllocateUserPhysicalPagesMapUserPhysicalPages. 这些工作有点像文件映射,只是当您将数据映射到地址空间时,它已经在物理内存中,而不必从磁盘中读取(即映射要快得多)。

于 2012-12-15T16:26:18.903 回答
1

根据您对分发的要求,我会嵌入或安装一个或多个Memcached实例,并让一个(或多个,如果需要)线程将块从磁盘馈送到 memcache。

一旦将数据移到 memcached 上,您就几乎不受 32 位限制的影响,尤其是当memcached 本身作为 64 位进程运行时。

基本上你会在你的程序中从一个套接字而不是文件中读取,而 memcached 将是一个花哨的文件缓存。

于 2012-12-15T15:58:25.883 回答