Tôi đang xử lý một số tệp văn bản theo từng dòng bằng cách sử dụng BufferReader.readlLine()
.Hiệu suất thấp với BufferedReader
Hai tệp có cùng kích thước 130MB nhưng một tệp mất 40 giây để được xử lý trong khi các tệp khác mất 75 giây.
Tôi nhận thấy một tệp có 1,8 triệu dòng trong khi các tệp khác có 2,1 triệu. Nhưng khi tôi cố gắng xử lý một tệp có 3,0 triệu dòng có cùng kích thước thì phải mất 30 phút để xử lý.
Vì vậy, câu hỏi của tôi là:
là hành vi này vì thời gian tìm kiếm của người đọc đệm (Tôi muốn biết làm thế nào
BufferedReader
công trình hoặc phân tích các dòng tập tin bằng dòng?)Có bất kỳ cách nào tôi có thể đọc các dòng tập tin bằng một cách nhanh hơn?
Ok bạn bè, tôi đang cung cấp thêm một số chi tiết.
Tôi chia dòng thành ba phần bằng cách sử dụng regex, sau đó sử dụng SimpleUnsortedWriter
(do Cassandra cung cấp) Tôi viết nó vào một số tệp dưới dạng khóa, cột và giá trị. Sau khi dữ liệu 16MB được xử lý, nó sẽ chuyển sang đĩa.
Nhưng logic xử lý giống nhau đối với tất cả các tệp, thậm chí một tệp có kích thước 330MB nhưng ít hơn không có dòng khoảng 1 triệu được xử lý trong 30 giây. Điều gì có thể là lý do?
deviceWriter = new SSTableSimpleUnsortedWriter(
directory,
keyspace,
"Devices",
UTF8Type.instance,
null,
16);
Pattern pattern = Pattern.compile("[\\[,\\]]");
while ((line = br.readLine()) != null)
{
//split the line i n row column and value
long timestamp = System.currentTimeMillis() * 1000;
deviceWriter .newRow(bytes(rowKey));
deviceWriter .addColumn(bytes(colmName), bytes(value), timestamp);
}
Đã thay đổi -Xmx256M to -Xmx 1024M
nhưng không giúp ích gì.
Cập nhật: Theo quan sát của tôi, khi tôi viết vào bộ đệm (trong bộ nhớ vật lý), là không. viết vào bộ đệm đang tăng các ghi mới hơn đang dành thời gian. (Đây là dự đoán của tôi)
Vui lòng trả lời.
Vui lòng đăng mã của bạn sử dụng BufferReader – razlebe
Có thể nó không liên quan đến BufferedReader, nhưng với quá trình xử lý bạn thực hiện với mỗi dòng. – Marcelo