2012-07-02 35 views
10

Tôi đang cố gắng tìm ra cách chia sẻ bộ nhớ giữa các quá trình python. Về cơ bản có những đối tượng tồn tại mà nhiều quá trình python cần phải có khả năng ĐỌC (chỉ đọc) và sử dụng (không có đột biến). Ngay bây giờ điều này được thực hiện bằng cách sử dụng redis + strings + cPickle, nhưng cPickle chiếm thời gian CPU quý giá vì vậy tôi không muốn sử dụng nó. Hầu hết các triển khai bộ nhớ chia sẻ python mà tôi đã thấy trên internets dường như yêu cầu các tệp và dưa chua về cơ bản những gì tôi đang làm và chính xác những gì tôi đang cố gắng tránh. Những gì tôi đang tự hỏi là nếu có một cách để viết như thế ... về cơ bản một bộ nhớ trong cơ sở dữ liệu đối tượng python/máy chủ và một mô-đun C tương ứng để giao tiếp với cơ sở dữ liệu? Không. Về cơ bản mô-đun C sẽ yêu cầu máy chủ cho một địa chỉ để viết một đối tượng, máy chủ sẽ trả lời với một địa chỉ, sau đó mô-đun sẽ viết đối tượng và thông báo cho máy chủ rằng một đối tượng có một khóa đã cho đã được viết vào đĩa tại vị trí đã chỉ định. Sau đó, khi bất kỳ quy trình nào muốn truy xuất đối tượng bằng khóa đã cho, họ sẽ chỉ yêu cầu db cho vị trí bộ nhớ cho khóa đã cho, máy chủ sẽ phản hồi vị trí và mô-đun sẽ biết cách tải không gian đó trong bộ nhớ và chuyển đối tượng python trở lại quá trình python.Bộ nhớ chia sẻ giữa các quá trình python

Điều đó hoàn toàn không hợp lý hoặc thực sự khó thực hiện? Tôi có đuổi theo thứ gì đó không thể? Mọi đề nghị sẽ được hoan nghênh. Cảm ơn bạn internet.

+1

Chính xác thời gian mà CPU của bạn đáng giá đến mức nó đáng giá một giải pháp làm việc ít khó khăn hơn để giữ đồng bộ hóa hơn những gì bạn đang đề xuất? Những gì bạn đang yêu cầu có thể được thực hiện nhưng nó sẽ là một nỗi đau lớn trong ass để làm * một cách chính xác *. – millimoose

+0

Thời gian CPU là quý giá nhất. Về cơ bản, các đối tượng giải đố có thể mất từ ​​20 ms (đối với một đối tượng nhỏ) đến 60 ms (đối với một đối tượng lớn). Cá nhân tôi cảm thấy rằng cả hai thời gian này quá dài. CHỈNH SỬA: Quá dài theo nghĩa là phải có cách nào tốt hơn, không phải tôi nghĩ cPickle không cố gắng hết sức. – nickneedsaname

+0

Chia sẻ bộ nhớ sẽ có thể thực hiện được, nhưng việc chia sẻ các đối tượng sẽ gặp khó khăn nghiêm trọng ... Một câu hỏi liên quan có thể tìm thấy ở đây: http://stackoverflow.com/questions/1268252/python-possible-to-share-in-memory-data -giữa-2-riêng biệt-quy trình (có một tốt đẹp writeup của Alex Martelli giải thích lý do tại sao điều này là khó khăn). – ChristopheD

Trả lời

5

Không hợp lý.

IPC có thể được thực hiện bằng tệp ánh xạ bộ nhớ. Python có chức năng xây dựng trong:

http://docs.python.org/library/mmap.html

Chỉ mmap tập tin trong cả hai quá trình và hey-mau bạn có một tập tin chia sẻ. Tất nhiên bạn sẽ phải thăm dò ý kiến ​​nó trong cả hai quá trình để xem những gì thay đổi. Và bạn sẽ phải hợp tác viết giữa cả hai. Và quyết định bạn muốn đưa dữ liệu của mình vào định dạng nào. Nhưng đó là giải pháp phổ biến cho vấn đề của bạn.

+6

Nhưng điều này vẫn yêu cầu tuần tự hóa thành byte, phải không? OP nói anh ta đang cố tránh điều đó. –

+0

Điều này sẽ loại một số serialization, vâng. Có lẽ tùy chỉnh serialization sẽ làm một công việc tốt hơn nếu loại đối tượng được biết đến. Ngoài ra, hãy bao gồm một mã băm để tránh tái deserialising một đối tượng hai lần. Tuy nhiên điều này được thực hiện, serialization là bắt buộc. – Joe

+0

Không serialization: ( – nickneedsaname

3

Nếu bạn không muốn tẩy, multiprocessing.sharedctypes có thể vừa khít. Đó là một chút thấp cấp, mặc dù; bạn nhận được các giá trị đơn hoặc mảng của các loại được chỉ định.

Một cách khác để phân phối dữ liệu cho các quy trình con (một chiều) là multiprocessing.Pipe. Điều đó có thể xử lý các đối tượng Python, và nó được thực hiện trong C, vì vậy tôi không thể cho bạn biết thời tiết nó sử dụng tẩy hay không.

Các vấn đề liên quan