Tôi đang duy trì trình phân tích cú pháp CSV hiệu suất cao và cố gắng tận dụng tối đa công nghệ mới nhất để cải thiện thông lượng. Đối với nhiệm vụ đặc biệt này này có nghĩa là:Java: giải mã luồng ký tự đa luồng
- bộ nhớ Flash (Chúng tôi sở hữu một card PCI-Express tương đối rẻ tiền, hiệu suất 1 TB dung lượng lưu trữ mà đạt 1 GB/s duy trì đọc)
- Nhiều lõi (Chúng tôi sở hữu một giá rẻ Máy chủ Nehalem có 16 luồng phần cứng)
Việc triển khai đầu tiên của trình phân tích cú pháp CSV là đơn luồng. Đọc tệp, giải mã ký tự, phân tách trường, phân tích cú pháp văn bản, tất cả trong cùng một chuỗi. Kết quả là một thông lượng khoảng 50MB/s. Không tệ nhưng thấp hơn giới hạn lưu trữ ...
Triển khai thứ hai sử dụng một chuỗi để đọc tệp (ở cấp byte), một chuỗi để giải mã các ký tự (từ ByteBuffer sang CharBuffer) và nhiều chuỗi để phân tích cú pháp các trường (tôi có nghĩa là phân tích cú pháp các trường văn bản được phân tách thành đôi, số nguyên, ngày tháng ...). Điều này hoạt động tốt hơn, gần 400MB/s trên hộp của chúng tôi.
Nhưng vẫn thấp hơn hiệu suất của bộ nhớ của chúng tôi. Và những SSD đó sẽ cải thiện một lần nữa trong tương lai, chúng tôi sẽ không tận dụng tối đa nó trong Java. Rõ ràng là giới hạn hiện tại là giải mã ký tự (CharsetDecoder.read (...)). Đó là nút cổ chai, trên một bộ xử lý mạnh mẽ Nehalem nó biến đổi byte thành ký tự tại 400MB/s, khá tốt, nhưng điều này phải được đơn luồng. Bộ mã CharsetDecoder hơi có trạng thái, tùy thuộc vào bộ mã được sử dụng và không hỗ trợ giải mã đa luồng.
Vì vậy, câu hỏi của tôi đối với cộng đồng là (và cảm ơn bạn đã đọc bài đăng cho đến nay): có ai biết cách song song hóa hoạt động giải mã ký tự trong Java không?
Thật không may, UTF-16 là mã hóa độ dài biến đổi. Bạn cần UTF-32 để phân tích cú pháp Unicode đơn giản như vậy. – grddev
@grddev - Tôi đã đề cập đến điều này trong bài đăng của mình - có thể xác định chuỗi ký tự ở giữa các dòng dữ liệu UTF-16 - các cặp thay thế cao là 0xD800-0xDBFF và các thay thế thấp là 0xDC00-0xDFFF. Mọi thứ khác được chứa trong cặp byte. – McDowell
Nhận xét của tôi đề cập đến đề cập đến UTF-16BE. Bạn hoàn toàn không thể giải mã được. Nhưng nó thực sự khá đơn giản. – grddev