2012-05-10 21 views
7

Tôi có một tập hợp lớn các đối số triết học, mỗi đối số kết nối với các đối số khác làm bằng chứng hoặc loại bỏ một tuyên bố đã cho. Một câu lệnh gốc có thể có nhiều bằng chứng và cách ly, mỗi cái cũng có thể có bằng chứng và cách ly. Các câu lệnh cũng có thể được sử dụng trong nhiều đồ thị và đồ thị có thể được phân tích theo "ngữ cảnh cụ thể" hoặc giả định.Sử dụng Goroutines của Google Go để tạo một mạng Bayes

Tôi cần xây dựng một mạng lưới các đối số liên quan đến Bayes để mỗi nút truyền tải ảnh hưởng khá chính xác đến các đối số được kết nối; Tôi cần để có thể tính toán xác suất của chuỗi các nút kết nối đồng thời, với mỗi nút yêu cầu tra cứu kho dữ liệu phải chặn để có được kết quả; quá trình này chủ yếu là I/O bị ràng buộc, và kết nối kho dữ liệu của tôi có thể chạy không đồng bộ trong java, go và python {google appengine}. Khi mỗi lần tra cứu hoàn thành, nó sẽ truyền các hiệu ứng cho tất cả các nút được kết nối khác cho đến khi delta xác suất giảm xuống dưới ngưỡng không liên quan {hiện tại là 0,1%}. Mỗi nút của quá trình phải tính chuỗi các kết nối, sau đó tổng hợp tất cả các kết quả trên tất cả các truy vấn để điều chỉnh kết quả hợp lệ, với kết quả bị xích ra ngoài với bất kỳ đối số được kết nối nào. Để tránh bị lặp lại vô hạn, tôi đã nghĩ đến việc sử dụng quy trình A * trong goroutines để truyền bá bản cập nhật cho các bản đồ đối số, với một heuristic dựa trên ảnh hưởng kép mà bỏ qua các nút khi xác suất ảnh hưởng giảm xuống dưới, 0,1%. Tôi đã cố gắng để thiết lập các tính toán với SQL gây nên, nhưng nó đã phức tạp và cách lộn xộn quá nhanh. Sau đó, tôi chuyển sang google appengine để tận dụng lợi thế của nosql không đồng bộ, và nó đã được tốt hơn, nhưng vẫn còn quá chậm. Tôi cần phải chạy các bản cập nhật đủ nhanh để có giao diện người dùng linh hoạt, vì vậy khi người dùng tạo hoặc bỏ phiếu hoặc chống lại bằng chứng hoặc không sử dụng, họ có thể thấy kết quả được phản ánh trong giao diện người dùng ngay lập tức.

Tôi nghĩ Go là ngôn ngữ được lựa chọn để hỗ trợ đồng thời mà tôi cần, nhưng tôi mở để đưa ra đề xuất. Ứng dụng khách là một ứng dụng javascript nguyên khối chỉ sử dụng XHR và websockets để đẩy và kéo các bản đồ đối số {và các bản cập nhật của chúng} trong thời gian thực. Tôi có một nguyên mẫu java có thể tính toán các chuỗi lớn trong 10 ~ 15 giây, nhưng theo dõi hiệu suất cho thấy rằng hầu hết thời gian chạy của tôi bị lãng phí trong đồng bộ hóa và chi phí từ ConcurrentHashMap.

Nếu có các ngôn ngữ khác cùng lúc đáng để thử, vui lòng cho tôi biết. Tôi biết java, python, go, ruby ​​và scala, nhưng sẽ học bất kỳ ngôn ngữ nào nếu nó phù hợp với nhu cầu của tôi.

Tương tự, nếu có các triển khai nguồn mở của mạng Bayes lớn, vui lòng để lại gợi ý.

+0

Một ứng dụng thú vị, nhưng câu hỏi của bạn chính xác là gì? – Sonia

+0

Vâng, cụ thể, tôi muốn biết liệu có bất kỳ tiêu chuẩn tiền lệ/công nghiệp nào để tính toán các mạng Bayesian khổng lồ hay không và liệu các goroutine có được tối ưu hóa cho công việc này như chúng dường như không. – Ajax

Trả lời

4

Tôi nghĩ hơi khó để nói những gì bạn đang hỏi. Có lẽ bạn có thể giải thích về câu hỏi của bạn.

Goroutines khá rẻ và phù hợp hoàn hảo cho các ứng dụng web hiện đại sử dụng XHR hoặc Websockets (và các ứng dụng liên kết I/O khác phải chờ phản hồi cơ sở dữ liệu và các công cụ tương tự). Ngoài ra, thời gian chạy đi cũng có khả năng thực thi các goroutine song song, do đó Go cũng phù hợp với các nhiệm vụ ràng buộc CPU, nên tận dụng nhiều lõi và tốc độ của một ngôn ngữ được biên dịch nguyên bản.

Nhưng bạn cũng nên nhớ rằng goroutines và kênh không miễn phí. Chúng vẫn yêu cầu một số lượng bộ nhớ và mỗi điểm đồng bộ hóa (ví dụ: một kênh gửi hoặc nhận) đi kèm với chi phí của nó. Điều đó thường không phải là vấn đề, vì việc đồng bộ hóa, so với truy vấn cơ sở dữ liệu chẳng hạn, rất rẻ, nhưng nó có thể không phù hợp để xây dựng mạng Bayes hiệu quả, đặc biệt nếu công việc thực tế của mỗi goroutine/node không đáng kể so với chi phí đồng bộ hóa.

Mục tiêu chính của bạn cho mọi chương trình đồng thời nên tránh tính có thể chia sẻ càng nhiều càng tốt.Vì vậy, mạng Bayesian được mô hình hóa với các kênh và kênh có thể là một ví dụ giáo dục tốt và là cách tuyệt vời để đo lường hiệu suất của việc triển khai kênh của Go, nhưng có thể không phù hợp nhất với vấn đề của bạn.

+2

... nhưng tốt hơn so với kích hoạt SQL, tôi nên suy nghĩ. – Sonia

+0

Công việc thực tế của mỗi nút mạng Bayesian sẽ yêu cầu tra cứu dữ liệu theo sau bởi tính toán và có khả năng tìm kiếm kho dữ liệu nhiều hơn cho đến khi xác suất được truyền xuống dưới ngưỡng không liên quan {0.1% hiện tại}. Mỗi tra cứu kho dữ liệu đòi hỏi phải chặn, do đó, tính toán chính nó là khá rẻ, nhưng đồng thời và đồng bộ hóa là khá tốn kém. Tôi có một nguyên mẫu java không đồng bộ có thể hoàn thành trong ~ 10 giây, một thời gian tôi dường như không thể cắt, ngay cả với nhiều luồng chạy nhiều truy vấn cùng một lúc {java threads = too heavyweight}. – Ajax

+0

Tôi sẽ cập nhật câu hỏi để phản ánh thực tế quá trình này chủ yếu là I/O bị ràng buộc; và tôi sẽ thực hiện điều này và báo cáo lại mọi kết quả/điểm chuẩn hiệu suất. – Ajax

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