Tôi có một ứng dụng Node truy cập cấu trúc dữ liệu tĩnh, lớn (> 100M), phức tạp, trong bộ nhớ, chấp nhận truy vấn và sau đó phân phát các lát nhỏ dữ liệu đó cho máy khách qua HTTP.Có cách nào để chia sẻ bộ nhớ giữa các công nhân/chủ đề/điều gì đó trong Node.JS không?
Hầu hết các truy vấn có thể được trả lời sau mười giây. Hoan hô cho Node!
Tuy nhiên, đối với một số truy vấn nhất định, việc tìm kiếm cấu trúc dữ liệu này sẽ mất vài giây. Điều này hút bởi vì mọi người khác phải chờ đợi.
Để phục vụ khách hàng hiệu quả hơn, tôi muốn sử dụng một số loại tính song song.
Nhưng, vì cấu trúc dữ liệu này quá lớn, tôi muốn chia sẻ nó giữa các công nhân hoặc chủ đề hoặc những gì có bạn, vì vậy tôi không ghi hàng trăm megabyte. Điều này sẽ hoàn toàn an toàn, bởi vì cấu trúc dữ liệu sẽ không được ghi vào. Một điển hình 'ngã ba()' trong bất kỳ ngôn ngữ khác sẽ làm điều đó.
Tuy nhiên, theo như tôi có thể nói, tất cả các cách tiêu chuẩn để thực hiện song song trong Node rõ ràng làm cho điều này là không thể. Vì sự an toàn, họ không muốn bạn chia sẻ bất cứ điều gì.
Nhưng có cách nào không?
Bối cảnh:
Đó là không thực tế để đặt cấu trúc dữ liệu này trong một cơ sở dữ liệu, hoặc sử dụng memcached, hoặc bất cứ điều gì như thế.
Thư viện API WebWorker và tương tự chỉ cho phép gửi các thông điệp tuần tự ngắn vào và ra khỏi công nhân.
Cụm nút của Node sử dụng một cuộc gọi có tên là 'ngã ba', nhưng nó không thực sự là một nhánh của quá trình hiện tại, nó tạo ra một cái mới. Vì vậy, một lần nữa, không có bộ nhớ chia sẻ.
Có lẽ câu trả lời thực sự đúng là sử dụng quyền truy cập giống như hệ thống tập tin vào bộ nhớ dùng chung, còn gọi là tmpfs hoặc mmap. Có một số thư viện nút mà làm cho mount() và mmap() có sẵn cho chính xác một cái gì đó như thế này. Thật không may sau đó người ta phải thực hiện truy cập cấu trúc dữ liệu phức tạp trên đầu trang của tìm kiếm đồng bộ và đọc. Ứng dụng của tôi sử dụng mảng mảng ma trận và vân vân. Nó sẽ là tốt đẹp để không phải reimplement tất cả những điều đó.
Bạn không thể làm trống tìm kiếm của mình (sử dụng 'process.nextTick' có lẽ) để nó không chặn phần còn lại? – robertklep
'Việc đặt cấu trúc dữ liệu này trong cơ sở dữ liệu là không thực tế, hoặc sử dụng memcached, hoặc bất cứ thứ gì như thế.' Cái gì ?? Kể từ khi? – freakish
freakish: Chúng tôi đang kiểm tra xem mỗi mục là một tập con của truy vấn. Hãy tưởng tượng chúng ta có một chuỗi "fooquux", và chúng ta muốn kiểm tra xem "ox" có nằm trong chuỗi đó không. Không có cách nào mà tôi biết để làm điều đó một cách hiệu quả với các hoạt động cơ sở dữ liệu thông thường. Nhưng nó rất dễ dàng nếu bạn có quyền truy cập vào nó như một cấu trúc dữ liệu thông thường. Sau đó, một số lượng lớn trong số này được sắp xếp và xếp hạng và đây là "con trỏ" cho nhiều dữ liệu hơn, một lần nữa không thực tế trừ khi chúng ta có chúng trong một cấu trúc dữ liệu. – NeilK