Tôi đã viết một ứng dụng Scala (2.9.1-1) cần xử lý vài triệu hàng từ một truy vấn cơ sở dữ liệu. Tôi đang chuyển đổi ResultSet
đến một Stream
sử dụng kỹ thuật thể hiện trong câu trả lời cho một trong những previous questions tôi:Mức tiêu thụ bộ nhớ của một Scala Stream song song
class Record(...)
val resultSet = statement.executeQuery(...)
new Iterator[Record] {
def hasNext = resultSet.next()
def next = new Record(resultSet.getString(1), resultSet.getInt(2), ...)
}.toStream.foreach { record => ... }
và điều này đã làm việc rất tốt.
Kể từ khi cơ thể của foreach
đóng cửa là rất CPU chuyên sâu, và như là một minh chứng cho tính thực tiễn của lập trình chức năng, nếu tôi thêm một .par
trước foreach
, việc đóng cửa được chạy song song với không có nỗ lực khác, ngoại trừ việc làm chắc chắn rằng phần thân của bao đóng là chỉ an toàn (nó được viết theo một kiểu chức năng không có dữ liệu có thể thay đổi ngoại trừ việc in tới nhật ký an toàn chỉ).
Tuy nhiên, tôi lo lắng về mức tiêu thụ bộ nhớ. Là .par
gây ra toàn bộ kết quả được đặt để tải trong RAM, hoặc không hoạt động song song tải chỉ như nhiều hàng vì nó có chủ đề hoạt động? Tôi đã phân bổ 4G cho JVM (64-bit với -Xmx4g
) nhưng trong tương lai tôi sẽ chạy nó trên nhiều hàng hơn và lo lắng rằng cuối cùng tôi sẽ có được một bộ nhớ ngoài.
Có mô hình nào tốt hơn để thực hiện loại xử lý song song này theo cách chức năng không? Tôi đã hiển thị ứng dụng này cho đồng nghiệp của tôi như là một ví dụ về giá trị của lập trình chức năng và máy đa lõi.
Chỉ courious. DBMS gì bạn đang sử dụng, và những gì Scala DB API để truy vấn nó? – santiagobasulto
Tôi đang truy cập cơ sở dữ liệu Microsoft SQL Server 2012 chạy trên Windows Server 2008 R2 bằng trình điều khiển JDBC của Microsoft (http://msdn.microsoft.com/en-us/sqlserver/aa937724). – Ralph