IO Вопрос: запись части файла - PullRequest
0 голосов
/ 26 июля 2010

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

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

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

Thx

нт

Ответы [ 2 ]

1 голос
/ 26 июля 2010

Общий комментарий «Вы должны переписать весь файл» применяется, когда строка, которую вы заменяете, имеет длину 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 голосов
/ 26 июля 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...