Tôi có một tệp ASCII trong đó mỗi dòng chứa một bản ghi có độ dài thay đổi. Ví dụ:đọc và viết theo khối trên linux bằng cách sử dụng c
Record-1:15 characters
Record-2:200 characters
Record-3:500 characters
...
...
Record-n: X characters
Vì kích thước tệp khoảng 10GB, tôi muốn đọc bản ghi theo khối. Sau khi đọc, tôi cần phải chuyển đổi chúng, viết chúng vào một tập tin ở định dạng nhị phân.
Vì vậy, để đọc, phản ứng đầu tiên của tôi là tạo ra một mảng char như
FILE *stream;
char buffer[104857600]; //100 MB char array
fread(buffer, sizeof(buffer), 104857600, stream);
- Là nó đúng để giả định, linux rằng sẽ phát hành một cuộc gọi hệ thống và lấy toàn bộ 100MB?
- Khi các bản ghi được phân cách bằng dòng mới, tôi tìm kiếm ký tự theo ký tự cho một ký tự dòng mới trong bộ đệm và tạo lại mỗi bản ghi.
Câu hỏi của tôi là đây là cách tôi nên đọc theo khối hoặc có cách thay thế tốt hơn để đọc dữ liệu theo khối và hoàn thành mỗi bản ghi? Có cách nào khác để đọc x số lượng các dòng có kích thước biến đổi từ một tệp ASCII trong một cuộc gọi không?
Tiếp theo khi viết, tôi cũng làm như vậy. Tôi có một bộ đệm char viết, mà tôi vượt qua để fwrite để viết một tập hợp toàn bộ các bản ghi trong một cuộc gọi.
fwrite(buffer, sizeof(buffer), 104857600, stream);
UPDATE: Nếu tôi setbuf (stream, buffer), nơi đệm là bộ đệm char 100MB của tôi, sẽ bỏ trở lại từ bộ đệm hoặc gây ra đĩa IO?
Nhìn vào fgets, nó sẽ nhận được một dòng tại một thời điểm cho bạn nếu bạn muốn. –
Tôi muốn tránh đọc từng dòng, nhưng muốn đọc các dòng có kích thước biến X trong một lần chụp. Ngoài ra, với fgets(), tôi sẽ phải có một bộ đệm trong đó dòng dài nhất sẽ phù hợp. Vì kích thước bản ghi của tôi có thể thay đổi từ vài 100 byte đến 16MB, tôi sẽ lãng phí bộ nhớ. – Jimm