2012-06-26 35 views
6

Tôi có một truy vấn trả về cho tôi khoảng 6 triệu hàng, quá lớn để xử lý tất cả cùng một lúc trong bộ nhớ.Làm cách nào để ước tính kích thước của cấu trúc dữ liệu trong scala?

Mỗi truy vấn trả về một Tuple3 [String, Int, java.sql.Timestamp]. Tôi biết chuỗi không bao giờ nhiều hơn khoảng 20 ký tự, UTF8.

Làm cách nào tôi có thể làm việc với kích thước tối đa của một trong các bộ dữ liệu này và nói chung, làm cách nào tôi có thể ước tính kích thước của cấu trúc dữ liệu scala như thế này?

Tôi có 6Gb trên máy tôi đang sử dụng. Tuy nhiên, dữ liệu đang được đọc từ cơ sở dữ liệu bằng cách sử dụng truy vấn scala vào Danh sách của Scala.

Trả lời

6

Đối tượng Scala tuân thủ các quy tắc tương tự như đối tượng Java, vì vậy mọi thông tin về những điều đó là chính xác. Here is one source, dường như ít nhất là phù hợp với các JVM 32 bit. (JVM 64 bit sử dụng 8 byte cho mỗi con trỏ, thường làm việc thêm 4 byte cộng với 4 byte cho mỗi con trỏ - nhưng có thể ít hơn nếu JVM đang sử dụng con trỏ nén, mặc định bây giờ, tôi nghĩ vậy.)

Tôi sẽ giả định máy 64 bit không có con trỏ nén (trường hợp xấu nhất); sau đó, Tuple3 có hai con trỏ (16 byte) cộng với Int (4 byte) cộng với chi phí đối tượng (~ 12 byte) được làm tròn tới 8 hoặc 32 byte gần nhất, cộng thêm một đối tượng phụ (8 byte). phiên bản chuyên biệt của Int. (Đáng buồn thay, nếu bạn sử dụng nguyên thủy trong bộ dữ liệu, chúng chiếm không gian nhiều hơn so với khi bạn sử dụng các phiên bản được gói.). String là 32 byte, IIRC, cộng với mảng cho dữ liệu là 16 cộng với 2 cho mỗi ký tự. java.sql.Timestamp cần lưu trữ một vài số Long s (tôi nghĩ là vậy), vì vậy đó là 32 byte. Tất cả đã nói, nó trên thứ tự của 120 byte cộng với hai cho mỗi nhân vật, mà tại ~ 20 ký tự là ~ 160 byte.

Hoặc, hãy xem this answer để biết cách đo kích thước đối tượng của bạn trực tiếp. Khi tôi đo lường nó theo cách này, tôi nhận được 160 byte (và ước tính của tôi ở trên đã được sửa chữa bằng cách sử dụng dữ liệu này để nó phù hợp; Tôi đã có một số lỗi nhỏ trước đây).

+0

Điểm tốt, tôi quên mất thêm chi phí trong chuỗi cộng với chi phí đối tượng. Tuy nhiên, nó không phải là rất nhiều dữ liệu. –

+0

Tại sao 24 cộng 2 mỗi ký tự trên mảng Chuỗi? IIRC, một mảng là 8 byte so với 4 byte cho một mảng không, cộng với các phần tử. –

+0

@DanielC.Sobral - Có đối tượng trên không cộng với chiều dài, đó là 16 byte trên một máy 64 bit, vì vậy tôi đã tắt một chút. –

2

Bạn đã sử dụng bao nhiêu bộ nhớ? 6 triệu trường hợp của một triple là thực sự không phải là rất nhiều!

Mỗi tham chiếu có phí trên 4 hoặc 8 byte, phụ thuộc vào việc bạn đang chạy 32 hay 64 bit (không nén "oops", mặc dù đây là mặc định trong JDK7 cho vùng dưới 32Gb). Vì vậy, ba của bạn có 3 tài liệu tham khảo (có thể có thêm tài liệu tham khảo do chuyên môn hóa - vì vậy bạn có thể nhận được 4 lần), Timestamp của bạn là một trình bao bọc (tham chiếu) xung quanh một long (8 byte). Int của bạn sẽ được chuyên biệt hóa (ví dụ: một số cơ bản int), vì vậy điều này tạo thêm 4 byte. Chuỗi là 20 x 2 byte. Vì vậy, về cơ bản bạn có trường hợp xấu nhất là cũng dưới 100 byte mỗi hàng; 10 hàng trên mỗi kb, 10.000 hàng trên mỗi Mb. Vì vậy, bạn có thể xử lý thoải mái 6 triệu hàng của bạn dưới 1 GB khối.

Thành thật mà nói, tôi nghĩ rằng tôi đã phạm sai lầm ở đây vì chúng tôi xử lý hàng ngày hàng triệu hàng khoảng hai mươi trường (bao gồm số thập phân, chuỗi vv) thoải mái trong không gian này.

+0

Bất kỳ sự hiểu biết nào về nó? – matanster

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