ฉันกำลังทำงานกับตัวจัดสรร mmap ที่อนุญาตให้เวกเตอร์ใช้หน่วยความจำจากไฟล์ที่แม็พหน่วยความจำ เป้าหมายคือเพื่อให้มีเวกเตอร์ที่ใช้หน่วยเก็บข้อมูลที่อยู่ในหน่วยความจำเสมือนที่แมปโดย mmap โดยตรง ปัญหาของเราคือการปรับปรุงการอ่านไฟล์ที่มีขนาดใหญ่มาก (> 10GB) ในหน่วยความจำโดยไม่มีการคัดลอกดังนั้นฉันต้องใช้ตัวจัดสรรที่กำหนดเองนี้
จนถึงตอนนี้ฉันมีโครงกระดูกของตัวจัดสรรที่กำหนดเอง (ซึ่งมาจาก std :: allocator) ฉันคิดว่ามันเป็นจุดเริ่มต้นที่ดีในการเขียนตัวจัดสรรของตัวเอง อย่าลังเลที่จะใช้โค้ดชิ้นนี้ในแบบที่คุณต้องการ:
#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() { }
};
}
หากต้องการใช้สิ่งนี้ให้ประกาศคอนเทนเนอร์ STL ดังนี้:
using namespace std;
using namespace mmap_allocator_namespace;
vector<int, mmap_allocator<int> > int_vec(1024, 0, mmap_allocator<int>());
มันสามารถใช้สำหรับการเข้าสู่ระบบทุกครั้งที่มีการจัดสรรหน่วยความจำ สิ่งที่จำเป็นคือโครงสร้างการเชื่อมโยงมิฉะนั้นคอนเทนเนอร์เวกเตอร์จะใช้ superclasses จัดสรรวิธี / deallocate
อัปเดต: ตัวจัดสรรการแมปหน่วยความจำมีให้บริการแล้วที่https://github.com/johannesthoma/mmap_allocatorและเป็น LGPL อย่าลังเลที่จะใช้มันสำหรับโครงการของคุณ