Tôi đã gặp phải sự cố tôi không thể tìm thấy giải pháp. Tôi đang sử dụng một HashSet để lưu trữ các giá trị. Các giá trị tôi lưu trữ là loại chu kỳ tùy chỉnh mà tôi đã ghi đè mã băm và bằng như sau để đảm bảo hiệu suất chậm không được mã hóa bằng phương pháp hascode hoặc các phương thức tương đương Ngoài ra tôi đã đặt công suất ban đầu của hashset thành 10.000.000HashSet. hiệu suất chậm trong bộ lớn
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (cycleId^(cycleId >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Cycle other = (Cycle) obj;
if (cycleId != other.cycleId)
return false;
return true;
}
Sau 1.500.000 giá trị đầu tiên khi tôi cố thêm giá trị mới (với phương pháp thêm của lớp HashSet), chương trình rất chậm. Cuối cùng tôi sẽ có java ra khỏi ngoại lệ bộ nhớ (ngoại lệ trong chủ đề "Thread-0" java.lang.OutOfMemoryError: Java heap không gian) trước khi các giá trị được lưu trữ đạt 1.600.000
IDE i sử dụng là Eclipse. Vì vậy, bước tiếp theo là tăng kích thước heap JVM từ giá trị mặc định lên 1 giga (sử dụng dấu phẩy Xmx1000M và Xms1000M) Giờ đây elipse bắt đầu với bộ nhớ gấp 10 lần (tôi có thể thấy điều đó ở góc dưới bên phải. kích thước bộ nhớ và bộ nhớ được sử dụng được hiển thị) nhưng một lần nữa tôi có cùng một hiệu suất "chậm" và cùng một lỗi bộ nhớ TRONG GIÁ TRỊ CÙNG như trước (sau 1.500.000 và trước 1.600.000) là rất kỳ quặc.
Có ai có ý tưởng đó có phải là vấn đề không?
Cảm ơn bạn trước
CycleId chính xác là gì? Nếu nó là một ID như trong danh tính và do đó duy nhất cho các chu kỳ sau đó chỉ cần trả về cycleId như hashcode. Nếu nó không phải là một số nguyên, sau đó lấy hashCode của loại đó là gì. Nếu nó là 64 bit và ID bắt đầu từ 0 (với phân phối đồng đều hoặc nhiều nhất trong bit 32 bit thấp hơn) thì hãy chuyển nó thành int. –
@lasseespeholt, tại sao? Sau đó, hashcode sẽ chỉ phụ thuộc vào 32 bit thấp hơn của lâu! Sử dụng * tất cả * các bit là con đường để đi. Hãy tưởng tượng loại thảm họa nào sẽ xảy ra nếu String.hashCode() chỉ sử dụng vài ký tự cuối cùng để tạo 32 hashCode! –
Bạn đã lược tả chương trình của mình để xác minh rằng đó là 'HashSet' đang làm chậm mọi thứ? –