2010-04-05 44 views
5

Đây có thể là một câu hỏi ngu ngốc, nhưng tài liệu của Google và MATLAB đã không thành công. Tôi có một tập tin nhị phân khá lớn (> 10 GB) mà tôi cần phải mở và xóa bốn mươi triệu byte cuối cùng hoặc lâu hơn. Có cách nào để làm điều này mà không đọc toàn bộ tập tin vào bộ nhớ trong khối và in nó ra một tập tin mới? Phải mất 6 giờ để tạo ra tập tin, vì vậy tôi đang nghĩ đến việc đọc lại toàn bộ nội dung.MATLAB - Xóa các phần tử của tệp nhị phân mà không tải toàn bộ tệp

EDIT:

Tệp có kích thước 14,440,000,000 byte. Tôi cần cắt nó thành 14.400.000.000.

+0

Bạn có số tiền chính xác ở cuối bạn muốn xóa không? Bạn có thể đọc nó theo từng phần, và sau đó chỉ dừng đọc ở một điểm nào đó? Tôi cho rằng đây là một tệp dữ liệu-- nó có một EOF hoặc một số chỉ báo khác cho thấy luồng đó đã hoàn tất chưa? – mmr

+0

Có, tôi biết số tiền chính xác mà tôi muốn xóa. Từ mất bao lâu để tạo tệp, đọc nó theo từng phần sẽ mất một thời gian miễn là tạo lại toàn bộ tệp, vì vậy không. Có, nó có một eof. – Doresoom

Trả lời

4

Tôi thấy Perl nhanh hơn nhiều so với MATLAB.

Dưới đây là hai ví dụ từ Perl Cookbook:

truncate(HANDLE, $length) 
    or die "Couldn't truncate: $!\n"; 

truncate("/tmp/$$.pid", $length) 
    or die "Couldn't truncate: $!\n"; 

Bạn có thể chạy Perl script từ MATLAB với PERL chức năng.

+0

Điều này nghe giống như giải pháp hoàn hảo --- nhưng tôi chưa thử nghiệm nó. – Jacob

+0

Tôi thực sự thích giải pháp của Andrew tốt hơn. Tự nhiên hơn với MATLAB. – yuk

+1

... và bây giờ tôi đã quyết định học Perl. Có vẻ khá hữu ích. – Doresoom

2

Vì bạn không muốn đọc tệp vào MATLAB (dễ hiểu), bạn đang xử lý các lệnh mức hệ thống. MATLAB có một cơ sở để gọi lệnh hệ thống bằng cách sử dụng "hệ thống" lệnh

system

Vì vậy, bây giờ vấn đề của bạn được giảm xuống còn tìm ra lệnh shell trong hệ điều hành của bạn mà sẽ làm điều đó cho bạn. Hoặc bạn có thể viết chương trình bằng cách sử dụng truncate() (unix - KennyTM) hoặc SetEndOfFile (cửa sổ)

5

Không có ftruncate() trong Matlab, nhưng bạn có quyền truy cập vào thư viện chuẩn Java đầy đủ trong JVM được nhúng trong Matlab và có thể sử dụng các lớp Java Nio.JavaAccessFile hoặc Java NIO để cắt bớt tệp.

Đây là chức năng Matlab gọi tới Java để lop n byte cuối cùng khỏi tệp. Nên có chi phí I/O tối thiểu.

function remove_last_n_bytes_from_file(file, n) 

jFile = java.io.RandomAccessFile(file, 'rw'); 
currentLength = jFile.length(); 
wantLength = currentLength - n; 
fprintf('Truncating file %s: Resizing to %d to remove %d bytes\n', file, wantLength, n); 
jFile.setLength(wantLength); 
jFile.close(); 

Bạn cũng có thể làm điều đó như một lớp lót.

java.io.RandomAccessFile('/path/to/my/file.bin', 'rw').setLength(n); 
+0

Chà, hoạt động tuyệt vời! Tôi đã thử nghiệm chỉ một lớp lót cuối cùng trên tệp> 4GB. – yuk

+0

+1 - Công trình này tuyệt vời, nhưng tôi chỉ có giải pháp của yuk làm việc khoảng 5 phút trước khi bạn đăng. Dù sao cũng cảm ơn bạn! – Doresoom

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