我需要在同一台机器上运行的两个Java应用程序(两个不同的JVM)之间共享数据.我确切地说要共享的数据很大(大约7 GB).应用程序必须非常快速地访问数据,因为它们必须以非常高的速率应答传入的查询.我不希望应用程序为每个应用程序保存一份数据副本.
我已经看到一个选项是使用内存映射文件.应用程序A从某处获取数据(比如数据库)并将其存储在文件中.然后应用程序B可以使用访问这些文件java.nio.我不知道到底内存映射文件是如何工作的,我只知道数据存储在一个文件,这个文件(或它的一部分)映射到内存的区域(虚拟内存?).因此,这两个应用程序可以读写内存中的数据,并且更改会自动(我猜?)提交到文件中.我也不知道文件的最大大小是否完全映射到内存中.
我的第一个问题是两个应用程序在这种情况下共享数据的不同可能性(我的意思是考虑到数据量非常大,并且访问这些数据必须非常快)?我确切地说这个问题与内存映射I/O无关,它只是知道解决同一问题的其他方法是什么.
我的第二个问题是使用内存映射文件的优缺点是什么?
谢谢
只是好奇我是否在Windows平台上创建共享内存阵列,如下所示:
HANDLE hFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1024 * 4, _T("mySharedMemName"));
if(hFile)
{
VOID* pData = MapViewOfFile(hFile, FILE_MAP_ALL_ACCESS, 0, 0, 1024 * 4);
//Is 'pData' array initialized with zeros the first time the 'hFile' is used?
}
Run Code Online (Sandbox Code Playgroud)
我第一次调用此代码片段时是否将内存数组初始化为0?如果不是,如何将其初始化为零?
我试图在我的应用程序(特别是Windows服务)中实现内存映射文件,然后使用C#表单从服务写入的MMF读取.不幸的是,我似乎无法从MMF中读取任何内容,更重要的是,表单似乎永远不会找到服务创建的MMF.下面是代码片段,概述了我在做什么,任何人都可以看到我做错了什么或能够指出我更好的方向?
服务:
private MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("AuditStream", 1024 * 1024);
private Mutex mutex = new Mutex(false, "MyMutex");
byte[] msg = new byte[1];
var view = mmf.CreateViewStream(0, 1);
byte[] rmsg = new byte[1];
for (int i = 0; i < 400; i++)
{
mutex.WaitOne();
for (int j = 0; j < msg.Length; j++)
{
msg[j] = (byte)i;
}
view.Position = 0;
view.Write(msg, 0, bufferSize);
//the next 3 lines verify that i wrote to the mmf and can potentially read from it …Run Code Online (Sandbox Code Playgroud) 我有一个C/C++应用程序,它在Unix中的共享内存中写入数据.现在我想通过使用Java的程序读取共享内存数据.
程序应该读取共享内存数据.有可能吗?
如果可能,需要一个小实现.
我想在两个(ndk-)进程之间共享数据.为此,我使用ashmem使用此来源.
一个过程是连续read(read_mem),一个过程是写一次(write_mem).
问题是读取过程没有获得编写器的值.
和
通过观察阅读器的地图,我发现android会立即删除共享内存文件ashmem_create_region.
// read_mem.c
#include <stdio.h>
#include <errno.h>
#include <sys/mman.h>
#include "ashmem.h"
#define SHM_NAME "test_mem"
int main(int argc, char **argv) {
int shID = ashmem_create_region(SHM_NAME, 2);
if (shID < 0)
{
perror("ashmem_create_region failed\n");
return 1;
}
// right here /dev/ashmem/test_mem is deleted
printf("ashmem_create_region: %d\n", shID);
char *sh_buffer = (char*)mmap(NULL, 2, PROT_READ | PROT_WRITE, MAP_SHARED, shID, 0);
if (sh_buffer == (char*)-1)
{
perror("mmap failed");
return 1;
}
printf("PID=%d", getpid()); …Run Code Online (Sandbox Code Playgroud) 我正面临一个新问题,即在为我的应用程序编写IPC代码时出现的问题.
在UWP之前,我能够using System.IO.MemoryMappedFiles;成功使用该指令.现在我无法使用using System.IO.MemoryMappedFiles;,我需要它.
每个人都面临同样的问题吗?如果是的话,你是如何解决的?
我的应用程序不再编译.
我已经尝试重新导入System.Core.dll作为参考,并使用DllImport,但都没有工作.
我有一个用java/scala实现的计算库.我还有一些node.js代码为我的应用程序提供服务.我需要找到一种方法,如何以最大的性能连接这2个世界,同时还要考虑简单性.我正在考虑通过共享内存进行进程间通信,但是在node.js中找不到任何成熟的方法
这应该主要作为代理机制从node.js代码调用一些java(理想情况下是任何)代码.从node.js到java方面,它只是请求元数据传递,但是从java到node.js有时可能会返回重要的数据(假设上边界为100-200 kb,90%左右为600-1000字节)但是,这个请求的数量可能很大.
认为OpenMP可能是一个选项,但也找不到Node的任何openmp协议实现.但是,对于java也没有明确的项目.
看起来目前的时刻有几种选择:
我正在使用多处理来为我的应用程序创建子流程.我还在进程和子进程之间共享一个字典.
我的代码示例:
主要流程:
from multiprocessing import Process, Manager
manager = Manager()
shared_dict = manager.dict()
p = Process(target=mysubprocess, args=(shared_dict,))
p.start()
p.join()
print shared_dict
Run Code Online (Sandbox Code Playgroud)
我的子流程:
def mysubprocess(shared_dict):
shared_dict['list_item'] = list()
shared_dict['list_item'].append('test')
print shared_dict
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,印刷值为:
{'list_item': []}
可能是什么问题呢?谢谢
我正在尝试使用AWS EC2容器服务(ECS)来运行dockerized webdriver(Selenium)Grid.根据docker-selenium github页面,如果我们想要使用selenium-node-chrome图像上的chrome浏览器运行长时间运行的测试,我们需要添加一些shared memory或者mount a volume到docker容器.
在我的EC2实例上,当我做的时候
df -h
Run Code Online (Sandbox Code Playgroud)
我看到/dev/shm存在并且存在3.7Gb of available free space.但是如果我使用该-v /dev/shm:/dev/shm属性将卷挂载到我的chrome节点容器,那么当我运行测试时,浏览器甚至不会出现.但是,如果我挂载父/dev目录,测试似乎运行了几秒钟,然后我得到"无法达到浏览器异常",因为浏览器然后关闭(我能够通过VNC查看器确认).这让我意识到通过ECS接口/ api安装卷不会有帮助.
如果我通过传递--shm-size属性就直接启动docker而不通过ECS路由
docker run --shm-size=2500m ....
Run Code Online (Sandbox Code Playgroud)
测试似乎毫无困难地运行.
但是,ECS显然不支持该--shm-size物业.那么如何修复或解决这个问题仍然使用ECS来传递--shm-size属性?在这里避免使用ECS是唯一的方法还是有其他更好的方法?
amazon-ec2 shared-memory amazon-web-services amazon-ecs docker
/dev/shm与在常规文件系统上写入文件相比,效率如何?据我所知,/dev/shm硬盘上也是一个空间,因此读/写速度是相同的。
我的问题是,我有96GB的文件,只有64GB的RAM(+ 64GB交换空间)。然后,来自同一进程的多个线程需要读取文件的随机小块(大约1.5MB)。
这是/dev/shm一个很好的用例吗?
它会比以只读模式从中打开文件/home然后传递给线程来读取所需的随机块更快吗?
shared-memory ×10
ipc ×4
java ×3
c# ×2
performance ×2
amazon-ec2 ×1
amazon-ecs ×1
android ×1
android-ndk ×1
ashmem ×1
c ×1
c++ ×1
docker ×1
filesystems ×1
io ×1
linux ×1
node.js ×1
python ×1
python-2.7 ×1
uwp ×1
winapi ×1