Tôi hiện đang viết một cái gì đó mà cần phải xử lý các tập tin văn bản rất lớn (một vài GiB ít nhất). Điều cần thiết ở đây (và điều này là cố định) là:Cách xử lý tệp văn bản rất lớn?
- CSV-based, sau RFC 4180 với ngoại lệ của dòng nhúng phá vỡ
- ngẫu nhiên truy cập đọc đến dòng này, mặc dù hầu hết từng dòng và gần cuối
- nối các dòng ở cuối
- (thay đổi dòng). Rõ ràng là các cuộc gọi cho phần còn lại của tệp được viết lại, nó cũng hiếm, vì vậy không đặc biệt quan trọng tại thời điểm này
Kích thước của tệp cấm lưu giữ nó hoàn toàn trong bộ nhớ (cũng không được mong muốn) thêm các thay đổi sẽ được duy trì càng sớm càng tốt).
Tôi đã nghĩ đến việc sử dụng vùng được ánh xạ bộ nhớ làm cửa sổ vào tệp được di chuyển xung quanh nếu một dòng nằm ngoài phạm vi của nó được yêu cầu. Tất nhiên, ở giai đoạn đó tôi vẫn không có trừu tượng ở trên mức byte. Để thực sự làm việc với nội dung tôi có một số CharsetDecoder
cho tôi một số CharBuffer
. Bây giờ vấn đề là, tôi có thể xử lý các dòng văn bản có lẽ chỉ tốt trong CharBuffer
, nhưng tôi cũng cần phải biết bù đắp byte của dòng đó trong tệp (để giữ bộ nhớ cache của các chỉ mục dòng và bù đắp để tôi không có để quét tệp từ đầu một lần nữa để tìm một dòng cụ thể).
Có cách nào để ánh xạ độ lệch trong một số CharBuffer
thành bù trừ trong kết hợp ByteBuffer
không? Nó rõ ràng tầm thường với ASCII hoặc ISO-8859- *, ít hơn với UTF-8 và với ISO 2022 hoặc BOCU-1 mọi thứ sẽ trở nên xấu xí (không phải là tôi thực sự mong đợi hai sau, nhưng UTF-8 nên là mặc định ở đây - và vẫn đặt ra vấn đề).
Tôi đoán tôi có thể chỉ chuyển đổi một phần của CharBuffer
thành byte một lần nữa và sử dụng độ dài. Hoặc là nó hoạt động hoặc tôi gặp vấn đề với dấu phụ trong trường hợp này tôi có thể ủy quyền sử dụng NFC hoặc NFD để đảm bảo rằng văn bản luôn được mã hóa rõ ràng.
Tuy nhiên, tôi tự hỏi liệu đó có phải là cách để đến đây không. Có lựa chọn nào tốt hơn không?
ETA: Một số trả lời cho câu hỏi phổ biến và góp ý ở đây:
Đây là một lưu trữ dữ liệu cho mô phỏng chạy, dự định được một sự thay thế nhỏ ish địa phương đến một cơ sở dữ liệu toàn diện. Chúng tôi cũng có các backend cơ sở dữ liệu và chúng được sử dụng, nhưng đối với các trường hợp chúng không có sẵn hoặc không áp dụng, chúng tôi muốn điều này.
Tôi cũng chỉ hỗ trợ một tập hợp con của CSV (không có ngắt dòng được nhúng), nhưng điều đó vẫn ổn. Các điểm có vấn đề ở đây là khá nhiều mà tôi không thể dự đoán bao lâu các dòng được và do đó cần phải tạo ra một bản đồ thô của tập tin.
Đối với những gì tôi đã nêu ở trên: Vấn đề tôi đang cân nhắc là tôi có thể dễ dàng xác định kết thúc của một dòng ở cấp độ ký tự (U + 000D + U + 000A), nhưng tôi không muốn giả định rằng điều này trông giống như 0A 0D
ở cấp độ byte (đã bị lỗi đối với UTF-16, ví dụ: ở đây là 0D 00 0A 00
hoặc 00 0D 00 0A
). Suy nghĩ của tôi là tôi có thể làm cho ký tự mã hóa có thể thay đổi được bằng các chi tiết mã hóa cứng mà tôi hiện đang sử dụng. Nhưng tôi đoán tôi chỉ có thể dính vào UTF-8 và ăn tất cả mọi thứ khác. Cảm thấy sai, bằng cách nào đó, mặc dù.
trông giống như tái tạo trang bộ nhớ đệm của máy chủ sql. Đây là kịch bản làm việc hay bất cứ thứ gì khác ngăn cản bạn sử dụng cơ sở dữ liệu nhúng? – Osw
Bất kể giải pháp thực tế nào, bạn sẽ cần phải xây dựng ít nhất một chỉ mục một phần hoặc nếu bạn kiểm soát hoàn toàn tệp và nội dung của tệp, bạn có thể cân nhắc sử dụng độ dài dòng cố định. – biziclop