什么时候适合使用<cflock scope ="application">或者它与<cflock name ="foo">相反?
具体来说,我对使用CFLock保护应用程序,会话或服务器范围中的共享对象感兴趣,但我也有兴趣了解ColdFusion中锁定的不同用法.
我怎样才能使用的shmat(),shmdt(),shmctl(),shmget()从Python的电话?它们隐藏在标准库的某个地方吗?
我正在使用可以在Ubuntu存储库或Python标准库(现在或将来的版本)中找到的System V绑定.
我在寻找一个明确的答案(如果确实存在)有多少内存应该通过创建共享内存的静态块时被分配boost::interprocess的managed_shared_memory.即使是官方的例子似乎也会分配任意大块的内存.
考虑以下结构:
// Example: simple struct with two 4-byte fields
struct Point2D {
int x, y;
};
Run Code Online (Sandbox Code Playgroud)
我最初的反应是必要的大小是8个字节,或者sizeof(Point2D).当我尝试构造一个对象时,这会失败,在运行时给出了seg-fault.
// BAD: 8 bytes is nowhere near enough memory allocated.
managed_shared_memory segment(create_only, "My shared memory", sizeof(Point2D));
Run Code Online (Sandbox Code Playgroud)
什么读/写操作导致seg-faults?堆栈操作?临时分配segment.construct()?分配共享内存时需要多少开销?
通过试错我发现,通过4大小乘可以为上述结构的工作,但是当我开始增加更多的领域,以我的分崩离析struct.所以,这是一个糟糕的黑客.
有些人可能会争辩说,"内存很便宜",在现代电脑,但我不同意这种理念和分配不喜欢比我更需要的,如果我能避免它.我昨天在Boost文档中挖了一遍,找不到任何建议.这是今天要学习新东西的!
我试图想出一种在python进程之间共享内存的方法.基本上存在多个python进程需要能够READ(仅读取)和使用(无突变)的对象.现在这是使用redis + strings + cPickle实现的,但cPickle占用宝贵的CPU时间,所以我不想使用它.我在互联网上看到的大多数python共享内存实现似乎都需要文件和泡菜,这基本上就是我已经在做的,而且正是我想要避免的.
我想知道的是,是否有办法编写类似...基本上是内存中的python对象数据库/服务器和相应的C模块来与数据库连接?
基本上C模块会向服务器请求写入对象的地址,服务器将使用地址进行响应,然后模块将写入对象,并通知服务器具有给定密钥的对象被写入磁盘.指定的位置.然后,当任何进程想要使用给定键检索对象时,他们只会向db请求给定键的内存位置,服务器将响应该位置,并且模块将知道如何在内存中加载该空间.将python对象传回python进程.
这完全是不合理的还是真的很难实施?我在追逐那些不可能的东西吗?欢迎大家提出意见.谢谢你上网.
由于我工作的政策,我无法使用比1.33.1更新的Boost版本,并且无法使用比4.1.2更新的GCC版本.是的,它是垃圾,但我无能为力.Boost 1.33.1不包含进程间库.
也就是说,我的一个项目需要将一个std::map(或更可能是一个std::unordered_map)放入共享内存中.当进程由单个进程("服务器")加载并由许多其他进程读取时,它仅被写入/修改一次.我之前没有做过共享内存IPC所以这对我来说是一个相当新的领域.我看一下,shmget()但似乎我不能继续使用相同的共享内存密钥进行分配(因为我认为STL容器分配器需要它).
是否还有其他使用共享内存的NON-BOOST STL分配器?
编辑:这已经做过的事情.Dobbs博士在2003年有一篇关于如何做到这一点的文章,我开始用它作为参考.但是,代码清单不完整,并且指向它们的链接会重定向到主站点.
编辑编辑:我不仅仅重写Boost.Interprocess的唯一原因是因为涉及的代码量很大.我只是想知道是否有一些比较简短的专门针对POSIX共享内存,我能重新从头开始写,因为网络之间的数据传输也受到了多天的审批流程...
大家好!
我们目前有以下与共享内存相关的参数:
Postgres的
shared_buffers = 7GB
max_connections = 1 500
max_locks_per_transaction = 1 024
max_prepared_transactions = 0 (not set)
Run Code Online (Sandbox Code Playgroud)
系统
SHMALL = 2 097 152
SHMMAX = 17 670 512 640
SHMMNI = 4096
Run Code Online (Sandbox Code Playgroud)
RAM的数量是24 693 176k
我们需要将max_connections增加到3 000.当我们尝试这样做时,我们遇到了错误
[1-1] FATAL: could not create shared memory segment: No space left on device
[2-1] DETAIL: Failed system call was shmget(key=5432001, size=8964661248, 03600)
[3-1] HINT: This error does *not* mean that you have run out of disk space.
It occurs …Run Code Online (Sandbox Code Playgroud) 我已经阅读了很多有关共享数组的问题,对于简单的数组来说这似乎很简单,但我仍然试图让它适用于我拥有的数组.
import numpy as np
data=np.zeros(250,dtype='float32, (250000,2)float32')
Run Code Online (Sandbox Code Playgroud)
我尝试以某种方式mp.Array接受它data,尝试将其转换为共享数组,我也尝试使用ctypes创建数组:
import multiprocessing as mp
data=mp.Array('c_float, (250000)c_float',250)
Run Code Online (Sandbox Code Playgroud)
我设法使代码工作的唯一方法是不将数据传递给函数,而是将编码的字符串传递给未压缩/解码,但最终会调用n(字符串数)进程,这似乎是多余的.我希望的实现是基于将二进制字符串列表切换为x(进程数)并传递此块,data以及a index除了data在本地修改之外的有效进程,因此关于如何使其共享的问题,任何示例工作使用自定义(嵌套)numpy数组已经是一个很好的帮助.
PS:这个问题是Python多处理的后续问题
我试图使用共享内存将数据从c ++应用程序流式传输到C#应用程序.根据我发现的例子,我有:
c ++(发送)
struct Pair {
int length;
float data[3];
};
#include <windows.h>
#include <stdio.h>
struct Pair* p;
HANDLE handle;
float dataSend[3]{ 22,33,44 };
bool startShare()
{
try
{
handle = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(Pair), L"DataSend");
p = (struct Pair*) MapViewOfFile(handle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, sizeof(Pair));
return true;
}
catch(...)
{
return false;
}
}
int main()
{
if (startShare() == true)
{
while (true)
{
if (p != 0) {
//dataSend[0] += 1; // here the …Run Code Online (Sandbox Code Playgroud) 我没有在JavaScript规范中看到任何内容,建议的DOM规范扩展相关SharedArrayBuffer,或者当前的WHAT-WG HTML规范建议当一个线程将消息发布到另一个线程和另一个线程时,将跨线程同步/更新共享内存处理消息.(在已经将共享内存发送给另一个之后.)但是,我也无法通过实验验证它没有发生(在我的测试中,我没有看到陈旧的值).是否有一些这样的保证,我错过了,如果是这样,它在哪里得到保证?例如,它是否记录在案postMessage而且我错过了它,或者有什么东西可以回到事件循环/作业队列来保证它(因为处理来自另一个线程的消息涉及这样做)等等?或者,它绝对不能保证(并且信息在某个地方的规范中)?
请不要推测或做出"合理猜测".我正在寻找难以获得的信息:来自规范来源的引文,一个可复制的实验,表明它不能得到保证(尽管我认为这是一个问题,它是否仅仅是一个实现错误),那样的事情.
下面是我的测试的源,但尚未能够捕获不同步的内存.要运行它,您需要使用当前支持的浏览器,SharedArrayBuffer我认为此刻意味着Chrome v67或更高版本(Firefox,Edge和Safari都有支持,但在2018年1月禁用它以响应Spectre和Meltdown Chrome也做了,但是在启用了网站隔离功能的平台上的v67 [2018年7月]重新启用了它.
sync-test-postMessage.html:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Sync Test postMessage</title>
</head>
<body>
<script src="sync-test-postMessage-main.js"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
sync-test-postMessage-main.js:
const array = new Uint32Array(new SharedArrayBuffer(Uint32Array.BYTES_PER_ELEMENT));
const worker = new Worker("./sync-test-postMessage-worker.js");
let counter = 0;
const limit = 1000000;
const report = Math.floor(limit / 10);
let mismatches = 0;
const now = performance.now();
const log …Run Code Online (Sandbox Code Playgroud) 我目前正在使用Java和C++应用程序之间的IPC共享内存,但寻找更方便的替代方案.
有人可以建议一个性能和速度相同的更好的方法吗?
谢谢!
shared-memory ×10
c++ ×4
ipc ×3
python ×3
boost ×1
c ×1
c# ×1
coldfusion ×1
coldfusion-8 ×1
interprocess ×1
java ×1
javascript ×1
linux ×1
locking ×1
multiprocess ×1
numpy ×1
postgresql ×1
sysv ×1