Những gì bạn đang đề xuất không khả thi trực tiếp. Vì các quy trình mới có thể được xoay lên và xoay xuống ngoài tầm kiểm soát của bạn, nên không có cách nào để giữ dữ liệu Python nguyên bản trong bộ nhớ.
Tuy nhiên, có một số cách để giải quyết vấn đề này.
Thông thường, một mức lưu trữ khóa-giá trị là tất cả những gì bạn cần. Và đôi khi, có bộ đệm kích thước cố định cho các giá trị (bạn có thể sử dụng trực tiếp dưới dạng str
/ bytes
/ bytearray
các đối tượng; bất kỳ thứ gì khác bạn cần để struct
trong đó hoặc theo cách khác là tuần tự hóa) là tất cả những gì bạn cần. Trong trường hợp đó, khung bộ nhớ đệm tích hợp của uWSGI sẽ xử lý mọi thứ bạn cần.
Nếu bạn cần kiểm soát chính xác hơn, bạn có thể xem cách bộ nhớ đệm được triển khai trên SharedArea
và làm một cái gì đó tùy chỉnh. Tuy nhiên, tôi sẽ không khuyên bạn điều đó. Về cơ bản, nó cung cấp cho bạn cùng một loại API mà bạn nhận được với một tệp và lợi ích thực sự duy nhất so với việc chỉ sử dụng một tệp là máy chủ sẽ quản lý thời gian tồn tại của tệp; nó hoạt động ở tất cả các ngôn ngữ được uWSGI hỗ trợ, ngay cả những ngôn ngữ không cho phép tệp; và nó giúp dễ dàng di chuyển bộ đệm tùy chỉnh của bạn sang bộ đệm phân tán (nhiều máy tính) nếu sau này bạn cần. Tôi không nghĩ bất kỳ cái nào trong số đó có liên quan đến bạn.
Một cách khác để có được bộ nhớ khóa-giá trị bằng phẳng, nhưng không có bộ đệm kích thước cố định, là với stdlib anydbm
của Python . Việc tra cứu khóa-giá trị cũng giống như tìm kiếm:nó trông giống như một dict
, ngoại trừ việc nó được sao lưu vào cơ sở dữ liệu BDB trên đĩa (hoặc tương tự), được lưu vào bộ nhớ đệm nếu thích hợp trong bộ nhớ, thay vì được lưu trữ trong bảng băm trong bộ nhớ.
Nếu bạn cần xử lý một số kiểu đơn giản khác — bất kỳ thứ gì có thể giải nén / pickle cực kỳ nhanh chóng, chẳng hạn như int
s — bạn có thể muốn xem xét shelve
.
Nếu cấu trúc của bạn đủ cứng, bạn có thể sử dụng cơ sở dữ liệu khóa-giá trị cho cấp cao nhất, nhưng truy cập các giá trị thông qua ctypes.Structure
hoặc de / serialize với struct
. Nhưng thông thường, nếu bạn có thể làm điều đó, bạn cũng có thể loại bỏ cấp cao nhất, lúc này toàn bộ thứ của bạn chỉ là một Structure
lớn hoặc Array
.
Tại thời điểm đó, bạn chỉ có thể sử dụng một tệp thuần túy để lưu trữ — mmap
nó (cho ctypes
), hoặc chỉ open
và read
nó (cho struct
).
Hoặc sử dụng multiprocessing
Được chia sẻ của ctypes
Các đối tượng để truy cập Structure
của bạn trực tiếp ra khỏi vùng bộ nhớ dùng chung.
Trong khi đó, nếu bạn không thực sự cần tất cả dữ liệu bộ nhớ cache, thỉnh thoảng chỉ cần từng bit và từng mảnh, thì đó chính xác là mục đích của cơ sở dữ liệu. Xin nhắc lại, anydbm
, v.v. có thể là tất cả những gì bạn cần, nhưng nếu bạn có cấu trúc phức tạp, hãy vẽ sơ đồ ER, biến nó thành một tập hợp các bảng và sử dụng một cái gì đó như MySQL.