2010-04-22 26 views
8

Cách hiệu quả nhất để thêm một ký tự đơn lẻ vào một tệp nhiều gigabyte (trong trường hợp thực tế của tôi là một tệp 40 GB).Đăng ký một tệp nhiều gigabyte

Không có giới hạn về việc triển khai để thực hiện việc này. Có nghĩa là nó có thể được thông qua một công cụ, một kịch bản shell, một chương trình trong bất kỳ ngôn ngữ lập trình, ...

+0

Không có hệ thống tệp thị trưởng nào hỗ trợ đặt trước, bạn có hiệu quả phải viết lại tệp được đề cập. Tại sao chính xác bạn muốn * prepend * một ký tự vào một tập tin nếu tôi có thể yêu cầu? – codymanix

Trả lời

6

Không có giải pháp thực sự đơn giản. Không có cuộc gọi hệ thống nào để thêm dữ liệu, chỉ thêm hoặc viết lại.

Nhưng tùy thuộc vào những gì bạn đang làm với tệp, bạn có thể lấy đi các thủ thuật. Nếu tệp được sử dụng tuần tự, bạn có thể tạo named pipe và đặt cat onecharfile.txt bigfile > namedpipe và sau đó sử dụng "namedpipe" làm tệp. Điều tương tự cũng có thể đạt được bằng cách cat onecharfile.txt bigfile | program nếu chương trình của bạn lấy stdin làm đầu vào.

Để truy cập ngẫu nhiên hệ thống tệp FUSE có thể được thực hiện, nhưng có lẽ quá phức tạp cho việc này.

Nếu bạn muốn để có được bàn tay của bạn thực sự bẩn, tìm ra howto

  • phân bổ một khối dữ liệu (about inode and datablock structure)
  • chèn nó vào chuỗi của tập tin như khối thứ hai (hoặc đầu tiên và sau đó bạn thực tế thực hiện)
  • viết đầu tập tin vào khối
  • viết nhân vật duy nhất là lần đầu tiên trong tập tin
  • dấu khối đầu tiên như thể nó chỉ sử dụng một byte của tải trọng có sẵn (điều này có thể cho khối cuối cùng, tôi không biết liệu có thể chặn các khối ở giữa chuỗi tệp).

Điều này có khả năng phá hỏng hệ thống tệp của bạn, do đó không được khuyến nghị; tốt vui.

+0

Tôi không nhất thiết phải tìm giải pháp đơn giản nhất. Nó phải là giải pháp thực hiện có thể sử dụng kiến ​​thức tối nghĩa về Hệ điều hành hoặc hệ thống tệp hoặc có thể sử dụng các thủ thuật. – dafmetal

0

nếu bạn có nghĩa là thêm vào trước nhân vật mà khi bắt đầu của toàn bộ tập tin, một cách

$ echo "C" > tmp 
$ cat my40gbfile >> tmp 
$ mv tmp my40gbfile 

hoặc bằng cách sử dụng sed

$ sed -i '1i C' my40gbfile 

nếu bạn có nghĩa là thêm vào trước các nhân vật để mỗi dòng của tập tin

$ awk '{print "C"$0}' my40gbfile > temp && mv temp my40gbfile 
+0

Tôi chỉ muốn thêm ký tự một lần vào đầu toàn bộ tệp. – dafmetal

0

Theo tôi hiểu, điều này được xử lý ở cấp hệ thống tệp, có nghĩa là nếu bạn thêm dữ liệu vào một tệp, nó sẽ ghi lại tệp một cách hiệu quả. Đây là lý do tương tự tại sao các thẻ ID3 trong các tệp MP3 không được đệm, do đó các bản cập nhật trong tương lai không ghi đè toàn bộ tệp, nhưng chỉ cập nhật các byte được dành riêng đó.

Vì vậy, bất kỳ cách nào bạn sử dụng cũng sẽ cho kết quả tương tự. Những gì bạn có thể thử là thực hiện một số thử nghiệm với chức năng sao chép tùy chỉnh, đọc/ghi trong các khối lớn hơn bản sao hệ thống mặc định, nói 2MB hoặc 5MB, có thể cải thiện hiệu suất. Cuối cùng, đĩa I/O của bạn là nút cổ chai ở đây.

0

Có thể bạn không cần phải thực sự thực sự thêm vào bộ đệm vào tệp nhưng hầu như không. Có thể tồn tại một trình điều khiển hệ thống tập tin có khả năng ánh xạ nhiều tệp (1byte + 40gb) gần như thành một tệp ảo duy nhất.

3

Để tệp có khối ký tự rỗng ban đầu. Khi bạn thêm một ký tự, hãy đọc khối, chèn ký tự từ phải sang trái và viết lại khối. Khi khối đầy, sau đó thực hiện viết lại đầy đủ tốn kém hơn để thêm một khối rỗng khác. Bằng cách đó, bạn có thể giảm số lần bằng một nhân tố lớn mà bạn phải viết lại toàn bộ.

Đã thêm: Giữ tệp trong hai tệp con: A (đoạn ngắn) và B (tệp dài). Chuẩn bị cho bất kỳ cách nào bạn thích. Khi A được "đủ lớn", hãy thêm A đến B (bằng cách viết lại) và rõ ràng A.

Cách khác: Giữ tệp dưới dạng thư mục tệp nhỏ ..., A000003, A000002, A000001.
Chỉ cần thêm vào tệp được đánh số lớn nhất. Khi đủ lớn, hãy tạo tệp tiếp theo theo thứ tự.
Khi bạn cần đọc tệp, chỉ cần đọc tất cả chúng theo thứ tự giảm dần.

0

Đây là dòng lệnh của Windows ("DOS") cách:

Đặt bạn 1 char vào prepend.txt

copy /b prepend.txt + myHugeFile fileNameOfCombinedFile 
+0

Tôi cho rằng điều đó sẽ thất bại trong các tiêu chuẩn hiệu suất –

0

Cách hiệu suất cao hoàn toàn nhất dường như là để có được xuống mức các lĩnh vực và cách tệp thực sự được lưu trữ. Tôi không chắc liệu hệ điều hành có trở thành một nhân tố hay không, nhưng nền tảng đích có thể, dù sao thì nó cũng hữu ích cho chúng ta để biết bạn chạy cái gì.

Tôi nghĩ đây là trường hợp C là lựa chọn hiển nhiên, loại công cụ cấp thấp này chính xác là ngôn ngữ lập trình hệ thống là cho.

Bạn có thể cho chúng tôi biết bạn sẽ làm gì không, sẽ rất thú vị.

1

Bạn có thể đảo ngược việc triển khai của mình tùy thuộc vào sự cố của bạn: nối thêm các ký tự đơn vào cuối tệp của bạn. Khi đến lúc đọc tệp, hãy đọc nó trong đảo ngược.

Ẩn phần này phía sau đủ của lớp trừu tượng và có thể không tạo sự khác biệt cho mã của bạn cách các byte được lưu trữ trên thực tế.

+0

Tôi thích nó. Đó là kinda như câu trả lời của tôi chỉ thanh lịch hơn. –

0

Nếu bạn sử dụng Linux, bạn có thể thử sử dụng phiên bản tùy chỉnh READ (2) được nạp bằng LD_PRELOAD và để nó thêm dữ liệu của bạn vào lần đọc đầu tiên.

Xem https://zlibc.linux.lu/zlibc.html để biết cảm hứng thực hiện.

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