标签: shared-memory

使用 Ray 并行化大型程序的正确方法

我有一个相当大的 Python 程序(约 800 行),其结构如下:

  • 设置说明,我在其中处理用户提供的输入文件并定义对程序执行全局的变量/对象。
  • 主函数,它利用之前的设置阶段并调用程序的主要附加函数。
  • 附加函数可以是主要函数,即它们由主函数直接调用,也可以是次要函数,即它们仅由主要附加函数调用。
  • 我处理主函数结果的最后几行代码。

该程序是大规模并行的,因为主函数的每次执行都独立于前一个和下一个函数。因此,我使用 Ray 在集群中的多个工作节点上并行执行主函数。操作系统为 CentOS Linux 版本 8.2.2004(Core),集群执行 PBS Pro 19.2.4.20190830141245。我使用的是 Python 3.7.4、Ray 0.8.7 和 Redis 3.4.1。

我的Python脚本中有以下内容,foo主要函数在哪里:

@ray.remote(memory=2.5 * 1024 * 1024 * 1024)
def foo(locInd):
    # Main function

if __name__ == '__main__':
    ray.init(address='auto', redis_password=args.pw,
             driver_object_store_memory=10 * 1024 * 1024 * 1024)
    futures = [foo.remote(i) for i in zip(*np.asarray(indArr == 0).nonzero())]
    waitingIds = list(futures)
    while len(waitingIds) > 0:
        readyIds, waitingIds = ray.wait(
            waitingIds, num_returns=min([checkpoint, len(waitingIds)]))
        for r0, r1, r2, …
Run Code Online (Sandbox Code Playgroud)

python memory-management shared-memory redis ray

2
推荐指数
1
解决办法
3398
查看次数

共享内存分配> 2GB(需要链接到VB6使用的32位DLL)

我正在使用 C++ 中 boost 库的共享内存,我试图分配一个 unordered_map 与其他进程共享。服务器端代码如下:

地图创建器.h

//#pragma once
#pragma warning( disable :4494 )
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/managed_mapped_file.hpp>
#include <boost/functional/hash.hpp>
#include <boost/unordered_map.hpp>
#include <iostream>

struct dataClass {
    double Somma;
    int Contatore;
};

namespace bip = boost::interprocess;
namespace bc = boost::container;
#ifdef COLIRU
using Segment = bip::managed_mapped_file;
#else
using Segment = bip::managed_shared_memory;
#endif
using Mgr = Segment::segment_manager;

template <typename T> using Alloc = bip::allocator<T, Mgr>;
using MyString = bc::basic_string<char, std::char_traits<char>, Alloc<char>>;
using KeyType = MyString;
using …
Run Code Online (Sandbox Code Playgroud)

c++ boost shared-memory visual-studio

2
推荐指数
1
解决办法
180
查看次数

如何确保类没有虚拟方法?

我有一个类,其对象用于共享内存.因此,我必须确保它们没有虚拟方法(通过vtable调用时会使程序崩溃).

我想防止任何人意外添加违反此要求的虚拟方法.理想情况下,如果类包含虚方法,编译器甚至会拒绝编译该类.

解决方案不一定需要符合标准,只要它们适用于Apple的gcc-4.2或MSVC就足够了.

我怎样才能做到这一点?

c++ virtual-functions shared-memory

1
推荐指数
1
解决办法
320
查看次数

在Windows Mobile中动态分配内存映射文件的大小

我正在尝试找到一种为不同进程之间共享的内存映射文件动态分配内存的方法。我的设计如下:在Windows Mobile中,我正在编写一个显示线程,该线程使用共享内存处理来自不同进程的显示部分。计划是创建一个与屏幕大小相等的内存映射文件,例如:如果屏幕大小为640 X 480,那么我创建一个640 X 480 X 4的BYTE数组,然后与另一个进程共享该数组其他过程将更新内存中的hDC显示,然后将更新发送到显示线程以更新设备上的显示。这可以正常工作,但一个约束是在编译时分配内存,因为我们无法动态分配内存

(http://msdn.microsoft.com/zh-cn/library/aa366542%28v=vs.85%29.aspx)。当您不想更改文件的大小时(例如,映射只读文件时),请调用CreateFileMapping并为dwMaximumSizeHigh和dwMaximumSizeLow都指定零。这样做会创建一个与文件大小完全相同的文件映射对象。否则,您必须计算或估计完成文件的大小,因为文件映射对象的大小是静态的。一旦创建,它们的大小就不能增加或减小。

  1. 获取设备屏幕坐标后,是否可以分配内存映射文件的大小?一件事是为平板电脑,移动设备等不同屏幕大小的设备提供服务,另一件事是,如果应用程序只希望显示屏幕的一部分,那么我们应该能够仅以该大小创建内存映射。
  2. 除了内存映射文件,还有其他选择吗?之所以选择“内存映射文件”,是因为当其他进程修改显示时,它不需要发送所有更新详细信息,而只需设置一个互斥锁即可让Display线程知道它需要刷新屏幕。这样,通过5个不同应​​用程序的显示,我可以获得每秒50帧的刷新率。

提前致谢

c++ memory windows windows-mobile shared-memory

1
推荐指数
1
解决办法
969
查看次数

写入共享内存的频率限制?

单线程应用程序(C++)连续锁定,写入和解锁共享内存 - 每秒四次(循环程序设置为每秒运行一次,循环中有4次写入且没有读取).

EnterCriticalSection的(CS);
WriteToSharedMem();
LeaveCriticalSection(CS);

另一个应用程序(C)将再次访问这个共享内存每隔几分钟.

以这个速率写共享内存是否有任何问题?

Windows XP
C++

c c++ memory windows shared-memory

1
推荐指数
1
解决办法
197
查看次数

c#内存模型,锁定和同步

c#内存模型是否保证持有锁的线程能够保证在任何其他线程先前保持相同锁定时看到所执行的所有更新?

我一直在阅读c#规范,但似乎无法找到相关的细节.

c# multithreading locking memory-model shared-memory

1
推荐指数
1
解决办法
343
查看次数

C中的共享内存

我的进程正在访问已创建的共享内存.附加到共享内存的指针是一个包含指针和2或3个变量的结构.

例如:

typedef struct _info_t{
    int id;
    char c;
}info_t;

typedef struct _details_t{
    int buff_id;
    info_t* info;
}details_t;

details_t* details = shmat(shmid,(void*)0,0);
printf("\n %d \n",details->info->id);            // gives me a segmentation fault
Run Code Online (Sandbox Code Playgroud)

c unix shared-memory

1
推荐指数
1
解决办法
164
查看次数

std :: vector vs std :: list表示插入频率和动态大小

考虑我要向容器添加随机数量的项目的情况,即无法预测容器的大小,插入的频率高,插入应该在容器的末尾,除此之外我想删除一个几乎恒定时间的元素.

注意:我还想在共享内存中使用列表或向量.

所以在这种情况下,最好使用std :: vector或std :: list?

c++ list vector shared-memory c++11

1
推荐指数
1
解决办法
207
查看次数

共享内存中的std :: mutex无法正常工作

我有一个场景,共享内存区域由两个不同的进程专门访问.当我启动进程时,第一个进程成功锁定互斥锁,更新内存并解锁互斥锁.但我观察到当第二个进程试图锁定它时,它仍处于死锁状态,等待互斥锁解锁.

对于第一个和第二个进程,互斥锁之间的时间差为10秒.

我使用的是std :: mutex.请告诉我我错过了什么.

c++ multithreading mutex shared-memory stdmutex

1
推荐指数
2
解决办法
1606
查看次数

Windows上的写时复制文件映射

我有3个通过命名管道进行通信的进程:服务器,写入器,读取器。其基本思路是,作家可以存储大量(〜GB)的二进制块上的服务器,以及读卡器(S)可以找回。但是使用内存映射代替在命名管道上发送数据。

服务器与创建一个未命名的文件支持的映射CreateFileMappingPAGE_READWRITE保护,然后复制该句柄到作家。后作家已完成其工作,把手被复制到任何数量的感兴趣的读者

作家手柄与映射MapViewOfFileFILE_MAP_WRITE模式。

阅读器手柄的地图,MapViewOfFileFILE_MAP_READ|FILE_MAP_COPY模式。

阅读器上,我需要写时复制语义,因此,只要只读取映射,它就在所有阅读器实例之间共享。但是,如果读者想在其中写入内容(例如,就地解析或图像处理),则应将影响限制在修改过程中,并尽可能减少复制页面的数量。

问题
读者尝试写入映射时,它死于分段错误,好像FILE_MAP_COPY没有考虑到那样。上述方法有什么问题?根据MSDN,这应该有效...

我们在Linux上也实现了相同的机制(通过mmapfd传入AF_UNIX辅助缓冲区),并且它按预期工作。

c++ winapi shared-memory

1
推荐指数
1
解决办法
480
查看次数