2013-02-27 39 views
7

Tôi có 8 tệp. Mỗi người trong số họ là khoảng 1,7 GB. Tôi đang đọc những tập tin đó thành một mảng byte và hoạt động đó đủ nhanh.BufferedReader trong môi trường đa lõi

Mỗi tập tin sau đó được đọc như sau:

BufferedReader br=new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data))); 

Khi xử lý bằng một lõi duy nhất trong một cảm giác liên tục phải mất abour 60 giây để hoàn thành. Tuy nhiên, khi phân phối các tính toán trên 8 lõi riêng biệt phải mất đến nay dài hơn 60 giây cho mỗi tập tin.

Vì dữ liệu là tất cả trong bộ nhớ và không có hoạt động IO nào được thực hiện, tôi đã giả sử rằng sẽ mất không quá 60 giây để xử lý một tệp trên mỗi lõi. Vì vậy, tổng số 8 tập tin sẽ hoàn thành chỉ trong hơn 60 giây nhưng đây không phải là trường hợp.

Tôi có thiếu điều gì đó về hành vi BufferedReader không? hoặc bất kỳ độc giả nào được sử dụng trong mã trên.

Nó có thể đáng nói mà tôi đang sử dụng mã này để tải lên file đầu tiên:

byte[] content=org.apache.commons.io.FileUtils.readFileToByteArray(new File(filePath)); 

Mã khắp nơi trông như thế này:

For each file 
read the file into a byte[] 
add the byte[] to a list 
end For 
For each item in the list 
create a thread and pass a byte[] to it 
end For 
+0

Có bao nhiêu ổ đĩa được phân phối? Hay tất cả chúng đều được lưu trữ trên cùng một ổ đĩa? –

+2

Đối với các tệp lớn như vậy, tôi khuyên bạn nên sử dụng NIO. Vui lòng kiểm tra bài viết này: http://www.javalobby.org/java/forums/t17036.html, có thể hữu ích – n1ckolas

+0

Các tệp nằm trong bộ nhớ được lưu trữ trong một byte []. ổ đĩa không có liên quan ở đây. @RJRyV – DotNet

Trả lời

3

như thế nào bạn thực sự "phân phối các tính toán "? Có đồng bộ hóa không? Bạn chỉ cần tạo 8 chủ đề để đọc 8 tệp?

Bạn đang chạy nền tảng nào (linux, windows, v.v ...)? Tôi đã nhìn thấy hành vi dường như kỳ lạ từ các cửa sổ lên lịch trước khi nó di chuyển một quá trình từ cốt lõi đến cốt lõi để thử và cân bằng tải giữa các lõi. Điều này đã kết thúc gây ra hiệu suất chậm hơn so với chỉ cho phép một lõi duy nhất được sử dụng nhiều hơn phần còn lại.

+0

Đồng bộ hóa giữa các đối tượng là vấn đề. Cảm ơn Brett. – DotNet

2

Hệ thống của bạn rung lắc bao nhiêu bộ nhớ?

8 x 1.7GB, + phí hệ điều hành, có nghĩa là bộ nhớ/phân trang ảo phải được phát. Rõ ràng là chậm hơn nhiều so với RAM.

Tôi đánh giá cao bạn nói rằng mỗi tệp có trong bộ nhớ, nhưng bạn có thực sự có RAM 16 GB hoặc có nhiều thứ đang diễn ra ở cấp tóm tắt không?

Nếu công tắc ngữ cảnh cũng phải liên tục chuyển đổi các trang, điều đó sẽ giải thích thời gian tăng lên.

+0

Cảm ơn câu trả lời của bạn, tôi có đủ bộ nhớ để chứa dữ liệu. Không có phân trang hoặc sử dụng bộ nhớ ảo. – DotNet

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