3 ms·
Disregarding the copy time, why not just find the 300M-th newline and move everything else down, then truncate?
by kreetx 6y ago
Disregarding the copy time, why not just find the 300M-th newline and move everything else down, then truncate?
- kingofpandora 6y agoWhat does "move everything else down" mean?
- jgalar 6y agoI would guess memory map the whole file, then do the equivalent of: memmove(beginning_of_file, beginning_of_file + 300_m_line_offset, file_size - 300_m_line_offset);
- kreetx 6y agoAs someone not too familiar with precise system calls/file system internals, I just meant that if the "keep" part of the file starts at byte 1234, then start moving all of them at an above that location to locations at and above 0 (i.e to the beginning). And when the last byte is now at byte `last - 1234` then truncate the file. One could write a tiny program to do that and I'd feel relatively safe running that. (All that `dd` stuff would probably work too, and faster, but you'd need to spend time learning it first then. But that tool probably has discrepancies between OS'es, has history, etc. Can be simpler to just write the program.) EDIT: and you can iterate in blocks of the size of the disregarded prefix.
- vaccinator 6y agoWhy do you need to move everything down? Can't you just tell the filesystem that the file moved and changed size?