Возможные альтернативы:
a) Когда вы удаляете что-либо из буфера (например, от начала буфера до середины), сдвигайте любые оставшиеся данные (например, сдвигайте данные из середины в конец обратно).в начало), а затем снова заполните буфер (от нового середины до конца).Примечание: это не может работать, если одна строка текста может быть больше, чем буфер.
b1) Сделать буфер больше, чем файл.Таким образом, вы можете просто заменить символы новой строки символами конца строки (и, возможно, отбросить любой «пробел в конце строки» и пропустить пустые строки и т. Д.);и избегайте целой кучи "malloc()
накладных расходов", потому что вам не нужно выделять память для каждой отдельной строки (потому что вы повторно используете память, которую вы уже выделили).Примечание: это не может работать, если файл может быть больше доступной виртуальной памяти.
b2) Используйте mmap()
, чтобы отобразить файл в памяти;затем замените символы новой строки символами конца строки и т. д. Примечание. Это не может работать, если файл может быть больше доступной виртуальной памяти.
c1) Прекратить использовать ужасные форматы файлов в виде простого текста и просто хранить строки (с ограничителями строки и без символов новой строки) в файле для начала.Это позволяет вам mmap()
без изменения памяти после.Примечание: это не может работать, если файл может быть больше доступной виртуальной памяти.
c2) Прекратить использовать ужасные форматы файлов в виде простого текста, сохранить строки в файле, но также иметь список / массив /индекс «смещение в файле для начала строки» в начале файла.Это позволяет вам mmap()
без изменения памяти, а также избавляет от необходимости сканировать весь файл в поисках конца каждой строки / начала следующей строки.Примечание. Это не может работать, если файл может быть больше доступной виртуальной памяти.
Если данные файла уже кэшированы в ОЗУ операционной системой;«option c2)» может быть в 1000 раз быстрее, чем «option a)».
e) Объединить «опция b2)» с «опция c2)».Когда ваша программа запускается, сравните метки времени для «input.txt» и «input.bin», а если «input.txt» новее, используйте «option b2)», сгенерируйте индекс и сохраните его как «input.bin» дляв следующий раз;в противном случае (если «input.bin» новее), используйте «option c2)».