2010-07-25 3 views
0

У меня есть общий вопрос об IO. Я пытался заменить одну строку в файле с кодировкой ascii. Немного побывав, я обнаружил, что это невозможно. В соответствии с тем, что я прочитал, если одну строку нужно заменить в файле, весь файл нужно переписать. Я читал, что это то же самое для всех ОС. После прочтения, что я думал нормально, нет выбора, я просто переписал весь файл. \ NIO Вопрос: Запись части файла

Что заставило меня задуматься об этом снова, я работаю с программой, которая использует «.dat» и « .idx "для своей базы данных. Программа постоянно читает и записывает в db. Поэтому мой вопрос заключается в том, что, очевидно, нужно писать только небольшие порции за раз (размер db составляет около 200 МБ), поэтому невозможно эффективно писать весь файл каждый раз. Поэтому мой вопрос заключается в том, какое решение будет иметь такая программа для такой проблемы. Будет ли он записываться в память, а затем время от времени переписывать всю базу данных. Будет ли это писать временные файлы, а затем слияние их с БД в какой-то момент? Или возможно, что одна (или несколько) строк в db будет записана без написания всего файла?

Любая информация об этом была бы принята с благодарностью!

Thx

нт

ответ

0

Это не верно НТМФ. Вы действительно можете писать в середине файла. Как вы это делаете, зависит от используемой вами системы и языка программирования. То, что вы ищете, может быть seek операции в IO.

Ну, вам не нужно будет переписывать весь файл. Только остальная часть файла, где вы начинаете вставлять, так как эта часть должна быть перемещена за то, что вы вставляете.

Существует несколько способов решить эту проблему, например, зарезервировать место в файле (сделать файл более крупным). Таким образом, вам нужно будет только переместить данные, когда области заполнителей будут заполнены.

Напишите немного больше, и мы сможем вам помочь.

+0

Помните, что вы можете заменить материал только в файле (или добавить к нему) - не удалять или вставлять материал. Таким образом, если вы хотите заменить строку, ваша новая строка должна иметь ту же длину, что и старая один. – nos

1

Общий комментарий «вы должны переписать весь файл» применяется, когда строка, которую вы заменяете, имеет длину L1, а добавляемая строка имеет длину L2 и L1 ≠ L2. Проблема в том, что если L1 больше L2, тогда вам нужно переместить данные в остальную часть файла по файлу, чтобы не оставлять пробел с мусором, где заканчивался конец строки (и вы должны отрубать хвост файл - укорачивает его, чтобы не оставлять мусор в конце). И наоборот, если L1 меньше L2, вам нужно переместить строки после строки вверх, чтобы избежать того, чтобы новая строка перезаписывала начало следующей строки.

В случае с файлами .dat и .idx вы обнаружите, что действительно вы правы: программное обеспечение не переписывает весь файл каждый раз. Существует умеренная вероятность того, что файлы представляют собой файл C-ISAM или одну из связанных систем (D-ISAM, T-ISAM и т. Д.). В исходном (Informix) C-ISAM файл .dat содержит записи фиксированной длины, поэтому можно писать по любой старой записи с новой записью, потому что L1 = L2, всегда. Файл .idx более сложный, но он разбивается на страницы (возможно, размером 512 байт на страницу), и когда требуется редактирование, вся страница переписывается. Поскольку страницы имеют одинаковый размер, L1 = L2 снова - и безопасно переписывать только измененный раздел файла индекса.

Когда файл C-ISAM содержит данные переменной длины, фиксированная часть записи сохраняется в файле .dat, а часть переменной длины данных хранится на страницах в файле .idx. Эта компоновка имеет только одно достоинство - она ​​оставляет записи в файле .dat с фиксированным размером.

+0

Спасибо за полезную информацию! – ntmp

+0

@ntmp: способ показать благодарность StockOverflow и связанным сайтам - это полезные ответы (возможно, ответы на несколько ответов на вопрос), а затем выбор (путем нажатия на белый тик, который станет зеленым, если вы нажали на него) самый полезный ответ. –

Смежные вопросы