2013-01-05 16 views
7

Tôi cần lưu trữ nhiều dữ liệu (Đối tượng) trong bộ nhớ (để tính toán).
Do tính toán được thực hiện dựa trên dữ liệu này, điều quan trọng là tất cả dữ liệu sẽ nằm trong cùng một bộ nhớ quá trình JVM.
Hầu hết dữ liệu sẽ được tạo từ Strings, Integers và các đối tượng con khác (Collections, HashSet, etc ...).
Vì chi phí bộ nhớ đối tượng của Java rất quan trọng (Chuỗi là UTF-16, mỗi đối tượng có 8 byte trên đầu) Tôi đang tìm các thư viện cho phép lưu trữ dữ liệu đó trong bộ nhớ với chi phí thấp hơn.
Tôi đã đọc bài viết thú vị về việc giảm bộ nhớ:
* http://www.cs.virginia.edu/kim/publicity/pldi09tutorials/memory-efficient-java-tutorial.pdf * http://blog.griddynamics.com/2010/01/java-tricks-reducing-memory-consumption.htmlGiảm thiểu phí bộ nhớ dữ liệu ứng dụng trong các quá trình java

Tôi chỉ tự hỏi nếu có một số thư viện cho các kịch bản như vậy trên mạng hoặc tôi sẽ cần phải bắt đầu lại từ đầu.
Để hiểu rõ hơn, yêu cầu của tôi tưởng tượng một máy chủ xử lý khối lượng bản ghi cao và cần phân tích chúng dựa trên hàng triệu bản ghi khác được lưu trữ trong bộ nhớ (với tốc độ xử lý cao).

Trả lời

5

cho phí thu phí có một cái nhìn tại trove - phí bộ nhớ của chúng thấp hơn lớp Bộ sưu tập tích hợp sẵn (đặc biệt là đối với bản đồ và bộ, trong JDK dựa trên bản đồ).
nếu bạn có các đối tượng lớn, có thể đáng giá để lưu chúng "được tuần tự hóa" như một số biểu diễn nhị phân nhỏ gọn (không phải là tuần tự hóa java) và deserialize trở lại đối tượng đầy đủ khi cần)
bạn cũng có thể sử dụng thư viện bộ nhớ cache ra đĩa? hãy xem infinispan hoặc ehcache. Ngoài ra, một số thư viện (ehcache trong số đó, nếu bộ nhớ phục vụ) cung cấp "bộ nhớ lưu trữ" như một phần của quá trình jvm của bạn - một bộ nhớ không bị GC quản lý bởi thư viện (bản địa). nếu bạn có một biểu diễn nhị phân hiệu quả, bạn có thể lưu trữ nó ở đó (không hạ thấp phần chân của bạn nhưng có thể làm cho GC hoạt động tốt hơn)

+0

Cảm ơn! thư viện trove trông rất tuyệt. Bạn có quen thuộc với một số thư viện để giảm chi phí chuỗi không? –

+0

không thực sự. ngoại trừ việc lưu trữ các chuỗi ascii dưới dạng nhị phân và "deserializing" chúng trở lại không có gì nhiều tôi biết rằng bạn có thể làm - java chỉ có một chuỗi đại diện nội bộ và thats unicode. – radai

+0

Vâng, bây giờ tôi nghĩ về nó một số chi tiết, nếu những chuỗi lặp lại bản thân bạn có thể tập() họ để có được một trường hợp duy nhất, nhưng mặt lật là hồ bơi của những trường hợp duy nhất nằm trong permgen (ít nhất là trong java 6) và không được làm sạch, vì vậy bạn có thể bị rò rỉ. nếu họ thực sự lặp lại có thể bạn có thể thêm hồ bơi chuỗi duy nhất của riêng mình – radai

0

Về chuỗi, cũng nhìn vào -XX: + UseCompressedStrings jvm option, nhưng có vẻ như đã bị loại bỏ cập nhật jvm mới nhất, xem this other question

1

Đối với bit Chuỗi, bạn có thể lưu byte [] bạn nhận được từ String.getBytes ("UTF8"). Nếu bạn yêu cầu một đối tượng String một lần nữa, bạn có thể tạo lại nó từ ByteArray. Nó sẽ ofcourse phải chịu thêm một số CPU để tạo ra các đối tượng String hơn và hơn nữa, do đó, nó sẽ là một sự cân bằng giữa kích thước < -> tốc độ.

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