Java 内存映射文件:优缺点?

Java 内存映射文件:优缺点?,java,ipc,shared-memory,memory-mapped-files,Java,Ipc,Shared Memory,Memory Mapped Files,我需要在同一台机器(两个不同的JVM)上运行的两个Java应用程序之间共享数据。我认为要共享的数据非常大(大约7GB)。应用程序必须非常快地访问数据,因为它们必须以非常高的速率回答传入的查询。我不希望应用程序每个都保存一份数据副本 我已经看到一种选择是使用内存映射文件。应用程序A从某处(比如数据库)获取数据并将其存储在文件中。然后应用程序B可以使用java.nio访问这些文件。我不知道内存映射文件是如何工作的,我只知道数据存储在一个文件中,并且这个文件(或它的一部分)映射到内存的一个区域(虚拟内

我需要在同一台机器(两个不同的JVM)上运行的两个Java应用程序之间共享数据。我认为要共享的数据非常大(大约7GB)。应用程序必须非常快地访问数据,因为它们必须以非常高的速率回答传入的查询。我不希望应用程序每个都保存一份数据副本

我已经看到一种选择是使用内存映射文件。应用程序A从某处(比如数据库)获取数据并将其存储在文件中。然后应用程序B可以使用
java.nio
访问这些文件。我不知道内存映射文件是如何工作的,我只知道数据存储在一个文件中,并且这个文件(或它的一部分)映射到内存的一个区域(虚拟内存?)。因此,这两个应用程序可以在内存中读写数据,并且更改会自动(我猜?)提交到文件中。我也不知道是否有一个最大的文件大小完全映射到内存中

我的第一个问题是,在这种情况下,两个应用程序共享数据的可能性有哪些不同(我的意思是,考虑到数据量非常大,访问这些数据的速度必须非常快)?我认为这个问题与内存映射I/O无关,只是想知道解决同一问题的其他方法

我的第二个问题是使用内存映射文件的优缺点是什么

谢谢

我的第一个问题是两个应用程序共享数据的不同可能性是什么

正如S.洛特指出的,有很多机制:

  • 操作系统级
  • 操作系统级别(进程死亡后保持)
  • 操作系统级别(可以是匿名或文件备份)
  • 操作系统级(单向)
  • 操作系统级(单向)
  • 操作系统级别(双向)--是否
  • 操作系统级--适用于多线程程序
  • 将数据存储在文件中
  • 应用程序级别
  • 应用程序级别
  • 应用程序级别
  • 应用程序级别--
  • 应用程序级别
我的第二个问题是使用内存映射文件的优缺点是什么

优点:

  • 非常快——取决于您访问数据的方式,可以使用潜在的机制直接对数据进行操作,而不会造成速度损失。必须注意以一致的方式更新对象
  • 它应该是非常可移植的——在Unix系统上可用可能有25年时间(不管付出与否)
缺点:

  • 单一系统共享。如果您想将应用程序分发到多台机器上,共享内存不是一个很好的选择,但他们感觉很像是我思维方式的错误接口
  • 即使在单个系统上,如果内存位于单个系统上,但需要由来自多个节点的处理器访问,则与为每个节点提供自己的内存段相比,节点间请求可能会显著降低处理速度
  • 您不能只存储指针——所有内容都必须存储为基址的偏移量,因为内存可能映射到不同进程中的不同位置。我不知道这对Java对象意味着什么,尽管可能是一些聪明人尽了最大努力使它对Java程序员透明。如果您没有使用他们提供的机制,那么您可能必须自己完成这项工作。(在Java中没有实际的指针,这可能不是很繁重。)
  • 事实证明,始终更新对象是非常困难的。相反,在消息传递系统中传递消息通常会导致程序的并发错误更少。(中的并发编程感觉非常自然和直接。中的并发编程倾向于引入大量新的并发控件:,,)

内存映射文件听起来很头痛。一个简单且不易出错的选择是使用具有集群感知缓存的共享数据库。这样,只有写入数据才能进入数据库,而从缓存中读取数据才能得到服务


作为如何在hibernate中执行此操作的示例,请参见

能否提供详细信息,您希望如何准确地使用内存映射文件?我认为问题不在于触发其他程序中的某些操作。如果是这样,为什么不建立一个共享数据的公共数据库?@Pangea我有时间访问限制,应用程序必须快速访问数据。“我想有些解决方案不适合我的情况?”这不是真的。维基百科文章中的所有IPC通信技术都适用于您的案例。你选择了许多中的一个。这篇文章很好地描述了它们。不清楚是什么让你困惑,你还需要知道什么。你能扩大或澄清你的问题吗?你能引用维基百科文章中让你感到困惑或不完整的部分吗?“有很多解决方案,但肯定不符合我的要求”。错。文件并不慢。他们跑得很快。您可以快速共享物理文件。套接字也很快,可以处理大量数据。共享内存实际上就是内存映射文件。其余的都值得研究。你想知道什么?你能说得具体点吗?谢谢sarnold的详细回答。操作系统级解决方案和可移植性如何?当你说应用程序级别时,你的意思是它由JVM处理并且是可移植的?@Mickelmarrache:“应用程序级别”的意思是,作为应用程序作者,你必须提供基础设施,无论它是运行RabbitMQ、Linda、Memcached、CORBA还是RESTful web服务。(它们是否可以在同一个JVM中运行完全是另一回事。)所有操作系统级别的服务都是由操作系统提供的——这可能意味着您需要使用它们以本机方式使用它们。