【发布时间】:2012-01-21 12:39:08
【问题描述】:
我需要在同一台机器上运行的两个 Java 应用程序(两个不同的 JVM)之间共享数据。我确切地说要共享的数据很大(大约 7 GB)。应用程序必须非常快速地访问数据,因为它们必须以非常高的速率回答传入的查询。我不希望应用程序为每个应用程序保留一份数据副本。
我看到一种选择是使用内存映射文件。应用程序 A 从某个地方(比方说数据库)获取数据并将其存储在文件中。然后应用程序 B 可以使用java.nio 访问这些文件。我不确切知道内存映射文件是如何工作的,我只知道数据存储在一个文件中,并且这个文件(或其中的一部分)被映射到内存的一个区域(虚拟内存?)。因此,这两个应用程序可以读写内存中的数据,并且更改会自动(我猜?)提交到文件中。我也不知道文件完全映射到内存中是否有最大大小。
我的第一个问题是,在这种情况下,两个应用程序共享数据有哪些不同的可能性(我的意思是考虑到数据量非常大,并且访问这些数据必须非常快)?我确切地说这个问题与内存映射 I/O 无关,只是想知道解决同一问题的其他方法是什么。
我的第二个问题是使用内存映射文件的优缺点是什么?
谢谢
【问题讨论】:
-
您能否提供详细信息,您希望如何使用内存映射文件?
-
我看到问题不在于触发其他程序中的某些操作。如果是这样,为什么不使用通用数据库来共享数据?
-
@Pangea 我有时间访问限制,应用程序必须快速访问数据。
-
“我猜有些解决方案不适合我的情况?”这不是真的。维基百科文章中的所有 IPC 通信技术都适用于您的案例。你选择了许多之一。这篇文章很好地描述了所有这些。目前尚不清楚是什么让您感到困惑,您还需要了解什么。你能扩展或澄清你的问题吗?您能否引用维基百科文章中让您感到困惑或看起来不完整的特定部分?
-
“有很多解决方案,但有些不太符合我的要求”。错误的。文件不慢。他们非常快。您可以快速共享物理文件。套接字也很快,并且可以处理大量数据。共享内存实际上是内存映射文件。其余的都值得研究。你想知道什么?能具体点吗?
标签: java ipc shared-memory memory-mapped-files