2011-12-15 38 views
5

Tôi cần chia sẻ dữ liệu giữa hai ứng dụng Java chạy trên cùng một máy (hai JVM khác nhau). Tôi chính xác rằng dữ liệu được chia sẻ là lớn (khoảng 7 GB). Các ứng dụng phải truy cập dữ liệu rất nhanh vì chúng phải trả lời các truy vấn đến với tốc độ rất cao. Tôi không muốn các ứng dụng giữ từng bản sao dữ liệu.Các tệp được ánh xạ trên bộ nhớ: ưu và nhược điểm?

Tôi đã thấy rằng một tùy chọn là sử dụng các tệp được ánh xạ trên bộ nhớ. Ứng dụng A nhận dữ liệu từ đâu đó (giả sử một cơ sở dữ liệu) và lưu trữ nó trong các tệp. Sau đó, ứng dụng B có thể truy cập các tệp này bằng cách sử dụng java.nio. Tôi không biết chính xác cách thức các tệp ánh xạ bộ nhớ hoạt động, tôi chỉ biết rằng dữ liệu được lưu trữ trong một tệp và tệp này (hoặc một phần của nó) được ánh xạ tới một vùng của bộ nhớ (bộ nhớ ảo?). Vì vậy, hai ứng dụng có thể đọc-ghi dữ liệu trong bộ nhớ và những thay đổi được tự động (tôi đoán?) Cam kết tập tin. Tôi cũng không biết liệu có kích thước tối đa cho một tệp được ánh xạ hoàn toàn trong bộ nhớ hay không.

Câu hỏi đầu tiên của tôi là khả năng chia sẻ dữ liệu trong kịch bản này là bao nhiêu? Tôi chính xác rằng câu hỏi này không liên quan đến I/O được ánh xạ bộ nhớ, nó chỉ để biết những cách khác để giải quyết cùng một vấn đề.

Câu hỏi thứ hai của tôi là ưu và khuyết điểm của việc sử dụng các tệp ánh xạ bộ nhớ là gì?

Cảm ơn

+0

thể u cũng cung cấp chi tiết, làm thế nào chính xác bạn muốn sử dụng bộ nhớ file ánh xạ? – DarthVader

+0

Tôi thấy câu hỏi không phải là về việc kích hoạt một số hành động trong chương trình khác. Nếu vậy Tại sao không phải là một cơ sở dữ liệu chung để chia sẻ dữ liệu? –

+0

@Pangea Tôi có các ràng buộc về thời gian truy cập, các ứng dụng phải truy cập dữ liệu nhanh chóng. –

Trả lời

9

câu hỏi đầu tiên của tôi các khả năng khác nhau cho hai ứng dụng chia sẻ dữ liệu được là gì?

Như S. Lott chỉ ra, có một nhiều cơ chế:

câu hỏi thứ hai của tôi là những ưu và nhược điểm của việc sử dụng các file bộ nhớ ánh xạ là gì?

Ưu điểm:

  • rất nhanh - tùy thuộc vào cách bạn truy cập dữ liệu, có khả năng zero-copy cơ chế có thể được sử dụng để vận hành trực tiếp trên các dữ liệu không có hình phạt tốc độ. Cần phải cẩn thận để cập nhật các đối tượng theo cách thống nhất .
  • phải rất dễ sử dụng - có sẵn trên hệ thống Unix có thể là 25 năm (cung cấp hoặc lấy), and apparently Windows has mechanisms too.

Nhược điểm:

  • chia sẻ đơn hệ thống. Nếu bạn muốn phân phối ứng dụng của mình trên nhiều máy, bộ nhớ dùng chung không phải là một lựa chọn tuyệt vời. Distributed shared memory systems are available, nhưng họ cảm thấy rất giống với giao diện sai đối với cách suy nghĩ của tôi. Ngay cả trên một hệ thống duy nhất, nếu bộ nhớ nằm trên một đơn NUMA node nhưng cần được bộ vi xử lý truy cập từ nhiều nút, yêu cầu liên nút có thể làm chậm đáng kể quá trình xử lý so với mỗi nút của phân đoạn bộ nhớ của chúng.
  • Bạn không thể chỉ lưu trữ con trỏ - mọi thứ phải được lưu trữ là số số lẻ thành địa chỉ cơ sở vì bộ nhớ có thể được ánh xạ tại các vị trí khác nhau trong các quy trình khác nhau. Tôi không biết điều này có ý nghĩa gì đối với các đối tượng Java, mặc dù có lẽ ai đó thông minh đã làm hết sức mình để làm cho nó trở nên minh bạch đối với các lập trình viên Java. Nếu bạn không sử dụng các cơ chế được cung cấp của họ, thì bạn có thể phải tự mình làm việc đó. (Nếu không có con trỏ thực tế trong Java, có lẽ điều này không phải là rất nguy hiểm.)
  • Cập nhật các đối tượng luôn được chứng minh là rất khó khăn. Chuyển số immutable objects vào hệ thống gửi thư thay vì thường dẫn đến các chương trình có ít lỗi đồng thời hơn. Lập trình đồng thời ở nhiều hơn imperative languages có xu hướng giới thiệu một lượng lớn các điều khiển đồng thời mới: semaphores, mutexes, spinlocks, monitors).
+0

Cảm ơn sarnold cho câu trả lời chi tiết.Điều gì về các giải pháp cấp độ hệ điều hành và tính di động? Khi bạn nói cấp ứng dụng, bạn có nghĩa là nó được xử lý bởi JVM và nó có thể di chuyển được không? –

+0

@MickaelMarrache: bởi "cấp ứng dụng" Tôi có nghĩa là bạn, với tư cách là tác giả ứng dụng, phải cung cấp cơ sở hạ tầng, cho dù nó đang chạy dịch vụ web RabbitMQ, Linda, Memcached, CORBA hoặc RESTful. (Cho dù chúng có thể chạy trong cùng một JVM là một vấn đề khác hoàn toàn.) Tất cả các dịch vụ cấp hệ điều hành được cung cấp bởi hệ điều hành - có nghĩa là bạn cần phải sử dụng [module bổ sung] (http://bmsi.com/java /posix/index.html) để sử dụng chúng một cách tự nhiên. – sarnold

1

Tệp ánh xạ bộ nhớ có vẻ như đau đầu. Một tùy chọn đơn giản và ít xảy ra lỗi hơn là sử dụng cơ sở dữ liệu được chia sẻ với bộ nhớ cache nhận biết cụm. Bằng cách đó chỉ viết đi xuống cơ sở dữ liệu và đọc có thể được phục vụ từ bộ nhớ cache.

Như một ví dụ về làm thế nào để làm điều này trong Hibernate thấy http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-cache

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