- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 C++ 中使用来自 boost 库的共享内存,我正在尝试分配一个 unordered_map 以与其他进程共享。服务器代码如下:
MapCreator.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 MappedType = dataClass;
using ValueType = std::pair<KeyType const, MappedType>;
using MySHMMap = boost::unordered_map<KeyType, MappedType, boost::hash<MyString>,
std::equal_to<MyString>, Alloc<ValueType>>;
class MapCreator {
public:
static constexpr int sizeDeclared = 1324*1024*1024; //< Here the problem, if i set 2000*1024*1024, the client application throw error
MapCreator(const char* Nome) // : nameMemory(Nome)
{
nameMemory = Nome;
remove();
segment = Segment{ bip::create_only, nameMemory, sizeDeclared };
mappa = segment.find_or_construct<MySHMMap>("MySHMMapName")(segment.get_segment_manager());
}
dataClass getValue(std::string key) const {
return mappa->at(MyString(key.c_str(), segment.get_segment_manager()));
}
void insertValue(std::string key,dataClass value) {
mappa->emplace(MyString(key.c_str(), segment.get_segment_manager()),
value);
}
double getFreeMemory() {
return ((double)segment.get_free_memory() / 1024 / 1024 / 1024);
}
long getSize() {
return mappa->size();
}
void remove() {
bip::shared_memory_object::remove(nameMemory);
}
double getTotalSize() {
return (double)sizeDeclared/1024/1024/1024;
}
double getTotalMemory() {
return (double)segment.get_size() / 1024 / 1024 / 1024;
}
private:
// note: declaration order defines initialization order!
const char* nameMemory = "SharedMemoryName";
Segment segment;//{ bip::open_or_create, nameMemory, sizeDeclared };
MySHMMap* mappa = nullptr;
};
同时主要代码是这样的:
#include "MapCreator.h"
int main(){
MapCreator mappaClass("thread1");
mappaClass.insertValue("a", dataClass{ 3.12,2123 });
}
阅读器代码如下:
ReaderFromMemory.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 MappedType = dataClass;
using ValueType = std::pair<KeyType const, MappedType>;
using MySHMMap = boost::unordered_map<KeyType, MappedType, boost::hash<MyString>,
std::equal_to<MyString>, Alloc<ValueType>>;
class Reader {
public:
Reader() : mappa(segment.find_or_construct<MySHMMap>("MySHMMapName")(
segment.get_segment_manager()))
{
}
dataClass getValue(const char* key) const {
return mappa->at(MyString(key, segment.get_segment_manager())); // < Here is the error while reading
}
private:
// note: declaration order defines initialization order!
static constexpr char const* nameMemory = "thread1";
Segment segment{ bip::open_only, nameMemory };;
MySHMMap* mappa = nullptr;
};
这是主要的:
#include "ReaderFromMemory.h"
int main(){
Reader reader;
auto testValue = reader.getValue("a");
}
所以问题是分配和读取超过 2GB。
我已经尝试使用/LARGEADDRESSAWARE 标志,但对于 Reader 不起作用我正在使用:
Visual Studio 2022 用于在 x86 模式下编译,因为读取器是 VB6 使用的 DLL
boost 库版本 1.78.0
最佳答案
因为这应该在 32 位环境中工作,您可以在直接访问您现在拥有的一张 map 的顶部放置一个图层。以下是该想法的概要:
uint64_t hasher64(const KeyType& kt) {
//...
}
namespace std {
struct hash<KeyType> {
size_t operator()(const KeyType& kt) const {
return hasher64(kt) & 0xFFFFFFFF;
}
};
}
MySHMMap& getmap(const KeyType& kt) {
static MySHMMap maps[16];
return maps[(hasher64(kt) >> 32) & 0xF];
}
// ...
getmap(my_key)[my_key] = "foo";
上面对 key 进行了两次哈希处理,但会为您面临的限制提供解决方法。
您还可以有一个单独的、更便宜的函数来选择较小的 map 。如果您的 Key 是 std::string
, 可以通过查看字符串中的第一个字符来进行选择。
using KeyType = std::string;
MySHMMap& getmap(const KeyType& kt) {
static MySHMMap maps[16];
if(kt.empty()) return maps[0];
return maps[kt[0] & 0xF];
}
一个实现可以像这样开始(但绝不是完整的)。我使用标准类型和容器来避免 boost 弄乱它具体细节,但这个想法应该可行。
#include <unordered_map>
#include <iostream>
template<class KeyType, class MappedType, size_t MapCo,
class MapSelector = std::hash<KeyType>>
class MapOverlay {
public:
using MySHMMap = std::unordered_map<KeyType, MappedType>;
using value_type = typename MySHMMap::value_type;
struct iterator { // an iterator to iterate seamlessly over the multiple maps
iterator(MapOverlay* mo, MySHMMap& m, typename MySHMMap::iterator c) :
mo(mo), map(&m), it(c)
{
find_non_empty(); // find the first map with values
}
value_type& operator*() { return *it; }
value_type* operator->() { return &*it; }
iterator& operator++() {
if(it == map->end()) {
++map;
it = map->begin();
} else ++it;
find_non_empty();
return *this;
}
bool operator==(const iterator& rhs) const {
return map == rhs.map && it == rhs.it;
}
bool operator!=(const iterator& rhs) const { return !(*this == rhs); }
private:
void find_non_empty() { // find the next map with values
while(it == map->end() && map != &mo->maps[MapCo-1]) {
++map;
it = map->begin();
}
}
MapOverlay* mo;
MySHMMap* map;
typename MySHMMap::iterator it;
}; // iterator end
// some member functions making it feel like a normal unordered_map
MappedType& operator[](const KeyType& kt) {
return map_lookup(kt)[kt];
}
iterator find(const KeyType& kt) {
auto& m = map_lookup(kt);
auto it = m.find(kt);
if(it == m.end()) return end();
return {this, m, it};
}
iterator begin() { return {this, maps[0], maps[0].begin()}; }
iterator end() { return {this, maps[MapCo-1], maps[MapCo-1].end()}; }
private:
MySHMMap& map_lookup(const KeyType& kt) {
// call the map selector for `kt` and use `% MapCo` to get it in range
return maps[ms(kt) % MapCo]; // ms is an instance of MapSelector
}
MySHMMap maps[MapCo];
MapSelector ms;
};
以上默认为MapOverlay
将使用MapSelector
std::hash<KeyType>
在每个键上选择 map 。这可能比您需要的贵很多,因此您可以更快地提供一些替代品。使用 std::hash<KeyType>
如果您使用不同的实现来构建它,也有点冒险。 MapSelector
共享 map 的所有程序中的算法必须相同。
// a simple class to do the underlying map selection cheaper than
// std::hash<std::string> will:
struct getmap {
size_t operator()(const std::string& kt) const {
// a naive, quick and simple map selection:
if(kt.empty()) return 0;
return kt[0];
}
};
int main() {
MapOverlay<std::string, std::string, 16, getmap> mo; // 16 small maps
mo["apa"] = "bepa"; // this will be stored in one map
mo["foo"] = "bar"; // and this in another
for(auto&[k, v] : mo) std::cout << k << " = " << v << '\n';
auto it = mo.find("foo");
if(it != mo.end()) std::cout << it->first << " = " << it->second << '\n';
}
关于c++ - 共享内存分配 > 2GB(需要链接到 VB6 使用的 32 位 DLL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71696898/
我在具有 2CPU 和 3.75GB 内存 (https://aws.amazon.com/ec2/instance-types/) 的 c3.large Amazon EC2 ubuntu 机器上运
我想通过用户空间中的mmap-ing并将地址发送到内核空间从用户空间写入VGA内存(视频内存,而不是缓冲区),我将使用pfn remap将这些mmap-ed地址映射到vga内存(我将通过 lspci
在 Mathematica 中,如果你想让一个函数记住它的值,它在语法上是很轻松的。例如,这是标准示例 - 斐波那契: fib[1] = 1 fib[2] = 1 fib[n_]:= fib[n] =
我读到动态内存是在运行时在堆上分配的,而静态内存是在编译时在堆栈上分配的,因为编译器知道在编译时必须分配多少内存。 考虑以下代码: int n; cin>>n; int a[n]; 如果仅在运行期间读
我是 Python 的新手,但我之前还不知道这一点。我在 for 循环中有一个基本程序,它从站点请求数据并将其保存到文本文件但是当我检查我的任务管理器时,我发现内存使用量只增加了?长时间运行时,这对我
我正在设计一组数学函数并在 CPU 和 GPU(使用 CUDA)版本中实现它们。 其中一些函数基于查找表。大多数表占用 4KB,其中一些占用更多。基于查找表的函数接受一个输入,选择查找表的一两个条目,
读入一个文件,内存被动态分配给一个字符串,文件内容将被放置在这里。这是在函数内部完成的,字符串作为 char **str 传递。 使用 gdb 我发现在行 **(str+i) = fgetc(aFil
我需要证实一个理论。我正在学习 JSP/Java。 在查看了一个现有的应用程序(我没有写)之后,我注意到一些我认为导致我们的性能问题的东西。或者至少是其中的一部分。 它是这样工作的: 1)用户打开搜索
n我想使用memoization缓存某些昂贵操作的结果,这样就不会一遍又一遍地计算它们。 两个memoise和 R.cache适合我的需要。但是,我发现缓存在调用之间并不可靠。 这是一个演示我看到的问
我目前正在分析一些 javascript shell 代码。这是该脚本中的一行: function having() { memory = memory; setTimeout("F0
我有一种情况,我想一次查询数据库,然后再将整个数据缓存在内存中。 我得到了内存中 Elasticsearch 的建议,我用谷歌搜索了它是什么,以及如何在自己的 spring boot 应用程序中实现它
我正在研究 Project Euler (http://projecteuler.net/problem=14) 的第 14 题。我正在尝试使用内存功能,以便将给定数字的序列长度保存为部分结果。我正在
所以,我一直在做 Java 内存/注意力游戏作业。我还没有达到我想要的程度,它只完成了一半,但我确实让 GUI 大部分工作了......直到我尝试向我的框架添加单选按钮。我认为问题可能是因为我将 JF
我一直在尝试使用 Flask-Cache 的 memoize 功能来仅返回 statusTS() 的缓存结果,除非在另一个请求中满足特定条件,然后删除缓存。 但它并没有被删除,并且 Jinja 模板仍
我对如何使用 & 运算符来减少内存感到非常困惑。 我可以回答下面的问题吗? clase C{ function B(&$a){ $this->a = &$a; $thi
在编写代码时,我遇到了一个有趣的问题。 我有一个 PersonPOJO,其 name 作为其 String 成员之一及其 getter 和 setter class PersonPOJO { priv
在此代码中 public class Base { int length, breadth, height; Base(int l, int b, int h) { l
Definition Structure padding is the process of aligning data members of the structure in accordance
在 JavaScript Ninja 的 secret 中,作者提出了以下方案,用于在没有闭包的情况下内存函数结果。他们通过利用函数是对象这一事实并在函数上定义一个属性来存储过去调用函数的结果来实现这
我正在尝试找出 map 消耗的 RAM 量。所以,我做了以下事情;- Map cr = crPair.collectAsMap(); // 200+ entries System.out.printl
我是一名优秀的程序员,十分优秀!