2012-12-12 10 views
5

Tôi đã làm việc trên một chương trình Java tạo quỹ đạo fractal trong một thời gian dài. Giống như các bức ảnh, bức ảnh càng lớn thì nó sẽ càng đẹp hơn khi thu nhỏ lại. Chương trình sử dụng mảng đối tượng 2D (Point), được viết khi giá trị của một điểm được tính toán. Tức là Điểm được lưu trữ với giá trị tương ứng, I.e .:Ổ cứng Heap Java

Point p = new Point(25,30); 
histogram[25][30] = p; 

Tất nhiên, điều này được chỉnh sửa để đơn giản. Tôi chỉ có thể viết các giá trị điểm vào một CSV, và áp dụng chúng vào raster sau, nhưng sử dụng các phương thức tương tự đã mang lại kết quả không mong muốn. Tôi đã thử một thời gian khá lâu vì tôi thích có thể tạo ra những hình ảnh lớn hơn với không gian được giải phóng bởi không có mảng này. Nó sẽ không hoạt động. Để rõ ràng, tôi muốn thêm rằng đối tượng Point cũng lưu trữ dữ liệu màu.

Vấn đề tiếp theo là WriteableRaster, sẽ có cùng kích thước với mảng. Kết hợp cả hai chiếm nhiều bộ nhớ. Tôi đã chấp nhận điều này, sau khi cố gắng thay đổi cách nó được thực hiện nhiều lần, mỗi lần có kết quả chất lượng thấp hơn.

Sau khi cố gắng tối ưu hóa bộ nhớ và thời gian, tôi đã đi đến kết luận rằng tôi thực sự bị giới hạn bởi RAM. Đây là những gì tôi muốn thay đổi. Tôi biết về chuyển đổi -Xmx (đặt thành 10 GB). Có cách nào để sử dụng bộ nhớ ảo của Windows để lưu trữ raster và/hoặc mảng không? Tôi nhận thức rõ về hiệu suất đáng kể mà nó sẽ gây ra, nhưng thay vì giảm chất lượng, có vẻ như không có nhiều lựa chọn.

+1

Tôi nghĩ bạn muốn xem [Berkeley DB] (http://www.oracle.com/technetwork/products/berkeleydb/overview/persistence-160890.html), đặc biệt là sự kiên trì dựa trên chú thích cho POJO. –

Trả lời

2

Các hệ điều hành đã được làm cho không gian ổ cứng vào RAM cho bạn và mọi quá trình tất nhiên - không có phép thuật cần thiết. Điều này sẽ có nhiều hơn một thảm họa hiệu suất hơn bạn nghĩ; nó sẽ chậm đến mức không hiệu quả.

Bạn đang tìm kiếm tệp ánh xạ bộ nhớ? http://docs.oracle.com/javase/6/docs/api/java/nio/MappedByteBuffer.html

Nếu điều này thực sự được thực hiện trong bộ nhớ, tôi sẽ đặt cược rằng bạn có thể giảm đáng kể mức sử dụng bộ nhớ của bạn với một số tối ưu hóa. Ví dụ: đối tượng Point của bạn chủ yếu là trên không và không phải dữ liệu. Đếm số byte cần thiết cho tham chiếu, sau đó cho chi phí Object, so với hai số ints.

Bạn có thể giảm chi phí cho không có gì với hai mảng song song lớn int cho tọa độ x và y của bạn. Tất nhiên bạn sẽ phải đóng gói này để truy cập vào mã của bạn. Nhưng nó có thể giảm một nửa mức sử dụng bộ nhớ của bạn cho cấu trúc dữ liệu này. Hàng triệu đối tượng ít hơn cũng tăng tốc độ chạy GC.

Thay vì đặt WritableRaster vào bộ nhớ, hãy cân nhắc viết tệp hình ảnh ở một số định dạng hình ảnh đơn giản trực tiếp, chính bạn. BMP có thể rất đơn giản. Sau đó, có lẽ sử dụng một công cụ bên ngoài để chuyển đổi hiệu quả nó.

Hãy thử -XX:+UseCompressedOops để giảm chi phí đối tượng. Ngoài ra hãy thử -XX:NewRatio=20 hoặc cao hơn để làm cho JVM dự trữ gần như tất cả các vùng của nó cho các đối tượng tồn tại lâu dài. Điều này thực sự có thể cho phép bạn sử dụng nhiều heap hơn.

+0

Tôi không hiển thị nó trong ví dụ của tôi nhưng đối tượng Point cũng chứa dữ liệu màu. Tôi rất thích để chuck lớp Point thay vì một cái gì đó nhỏ hơn nhiều; tuy nhiên có ít nhất ba lớp học (lớn nhất) sẽ phải được viết lại gần như hoàn toàn. Lựa chọn thiết kế kém ngay từ đầu. Nếu tôi viết lại chương trình, tôi sẽ giải quyết vấn đề này. Bạn có biết cách viết trực tiếp lên JPEG không? Loại bỏ raster sẽ là một ơn trời. Nếu không, tôi sẽ viết thư cho BMP. Lý do duy nhất cho JPEG là của nhiều người tôi đã cố gắng, resizer hình ảnh khối lượng tốt nhất chỉ chấp nhận các tập tin JPEG. – Fractalife

0

Bạn không nên định cấu hình các tham số bộ nhớ JVM của mình (Xmx) để làm cho hệ điều hành phân bổ từ bộ nhớ hoán đổi của nó. rõ ràng là cơ chế thu gom rác cần phải có quyền truy cập ngẫu nhiên vào bộ nhớ heap và nếu không, chương trình sẽ thrash trong một thời gian dài và có thể bị khóa. hãy kiểm tra các câu trả lời cho câu hỏi đã đến (đoạn cuối) của tôi:

does large value for -Xmx postpone Garbage Collection