मैं एक एमएमएपी-एलोकेटर पर काम कर रहा हूं जो वैक्टर को मेमोरी-मैप की गई फ़ाइल से मेमोरी का उपयोग करने की अनुमति देता है। लक्ष्य में वेक्टर होते हैं जो स्टोरेज का उपयोग करते हैं जो सीधे एमएमएपी द्वारा मैप की गई वर्चुअल मेमोरी में होते हैं। हमारी समस्या यह है कि वास्तव में बड़ी फ़ाइलों (> 10GB) की मेमोरी को बिना कॉपी ओवरहेड के पढ़ने में सुधार किया जाता है, इसलिए मुझे इस कस्टम एलोकेटर की आवश्यकता है।
अब तक मेरे पास एक कस्टम आवंटनकर्ता का कंकाल है (जो कि std :: आवंटनकर्ता से प्राप्त होता है), मुझे लगता है कि यह खुद को आवंटित करने वाले लिखने के लिए एक अच्छा प्रारंभिक बिंदु है। जो कुछ भी आप चाहते हैं, उस कोड के इस टुकड़े का उपयोग करने के लिए स्वतंत्र महसूस करें:
#include <memory>
#include <stdio.h>
namespace mmap_allocator_namespace
{
// See StackOverflow replies to this answer for important commentary about inheriting from std::allocator before replicating this code.
template <typename T>
class mmap_allocator: public std::allocator<T>
{
public:
typedef size_t size_type;
typedef T* pointer;
typedef const T* const_pointer;
template<typename _Tp1>
struct rebind
{
typedef mmap_allocator<_Tp1> other;
};
pointer allocate(size_type n, const void *hint=0)
{
fprintf(stderr, "Alloc %d bytes.\n", n*sizeof(T));
return std::allocator<T>::allocate(n, hint);
}
void deallocate(pointer p, size_type n)
{
fprintf(stderr, "Dealloc %d bytes (%p).\n", n*sizeof(T), p);
return std::allocator<T>::deallocate(p, n);
}
mmap_allocator() throw(): std::allocator<T>() { fprintf(stderr, "Hello allocator!\n"); }
mmap_allocator(const mmap_allocator &a) throw(): std::allocator<T>(a) { }
template <class U>
mmap_allocator(const mmap_allocator<U> &a) throw(): std::allocator<T>(a) { }
~mmap_allocator() throw() { }
};
}
इसका उपयोग करने के लिए, एसटीएल कंटेनर को निम्नानुसार घोषित करें:
using namespace std;
using namespace mmap_allocator_namespace;
vector<int, mmap_allocator<int> > int_vec(1024, 0, mmap_allocator<int>());
इसका उपयोग उदाहरण के लिए किया जा सकता है जब भी मेमोरी आवंटित की जाती है। Neccessary रिबंड स्ट्रक्चर क्या है, वरना वेक्टर कंटेनर सुपरक्लासेस को आवंटित / डीलॉलेट विधियों का उपयोग करता है।
अद्यतन: मेमोरी मैपिंग आवंटन अब https://github.com/johannesthoma/mmap_allocator पर उपलब्ध है और LGPL है। अपनी परियोजनाओं के लिए इसका इस्तेमाल करने के लिए स्वतंत्र महसूस करें।