быстрая работа с файлами делфи

Тема в разделе "ASM, С/С++, Delphi, Java", создана пользователем Bicdibus, 2 май 2015.

  1. Bicdibus

    Bicdibus

    Регистр.:
    5 мар 2010
    Сообщения:
    485
    Симпатии:
    7
    сваял дорген, запись в файл происходит посимвольно, генерит очень медленно, 100 страниц около 20 мин. Шаблон считывается в переменную потом оттуда читается по одному символу и записывается в оконечный файл. работа с файлами по класической схэме как в паскале. Нашел еще метод записи через мемо компонент. Какой метод будет работать быстрее, раньше как-то не заморачивался оптимизацией алглритмов програм проц у меня 3 гиг, оператива тоже 3гиг.
     
  2. XanderDurden

    XanderDurden Создатель

    Регистр.:
    18 июл 2012
    Сообщения:
    10
    Симпатии:
    1
    пиши сразу большими кусками. Побайтово - это издевательство полное...
    TFileStream кури.
    Офтоп:
    блин, вообще, лень несусветная - писать на форуме и ждать ответа на такие простые вопросы вместо просмотра, я уверен, максимум 3-4 первых же линков по выдаче любого поисковика...
     
  3. firemen

    firemen Писатель

    Регистр.:
    18 ноя 2013
    Сообщения:
    8
    Симпатии:
    0
    var
    h: Integer;
    ..
    h:= FileOpen('c:\myFIle.txt', fmOpenWrite); // открыли существующий файл
    if h <1 then exit; // ошибка открытия
    fileSeek(h, 0, 2); установили указатель в конец файла.

    цикл

    FileWrite(h, буффер, кол. байт); // записали в файл

    конец_цикла

    fileCLose(h); // закрыли файл
     
  4. dreamkhv

    dreamkhv Создатель

    Регистр.:
    19 сен 2014
    Сообщения:
    32
    Симпатии:
    6
    delphi tstream - в гугл.
     
  5. nayman

    nayman Писатель

    Регистр.:
    11 дек 2013
    Сообщения:
    9
    Симпатии:
    1
    Можно запустить несколько потоков. Так будет быстрее.
     
  6. ssspider13

    ssspider13 Писатель

    Регистр.:
    4 окт 2015
    Сообщения:
    1
    Симпатии:
    0
    Лучше сделать небольшую обертку, так называемый FileReader, который будет читать из файла большой кусок, а затем из буфера выдавать символ. Если же буфер становится пустым, то происходит автоматическое считывание из файла, пока файл не будет считан до конца
     
  7. vinitek

    vinitek Создатель

    Регистр.:
    22 дек 2015
    Сообщения:
    37
    Симпатии:
    0
    быстрее всего через буфер и прямое обращение к памяти blockread(F,Pchar(Ansistring)^, Buff,fileR);
    blockwrite(TF,Pchar(Ansistring)^, Buff,fileW); буфер задаешь большой 512 кб статей много только нужно нормально просчитать размер последней записи и уменьшить размер буфера
     
  8. LosPejos

    LosPejos Писатель

    Регистр.:
    19 апр 2016
    Сообщения:
    2
    Симпатии:
    1
    не претендуя на последнюю инстанцию, в таком варианте ИМХО возможны всякие казусы в зависимости от того, в какой версии Delphi (например, unicode-aware или нет), всякие приколы с ANSIString/WideString и т.д. Скажу сразу, с дельфей работал давненько.
    Еще есть вариант Memory Mapped Files, кажется, они довольно быстрые, пример скинуть не могу (нету), надо погуглить.
     
  9. f483796

    f483796 Постоялец

    Регистр.:
    24 фев 2015
    Сообщения:
    49
    Симпатии:
    2
    Если уж совсем хардкора хочется, то используй функции работы с файлами WinAPI. Там и скорость и низкий уровень доступа
     
  10. aleksey74

    aleksey74 Создатель

    Регистр.:
    10 авг 2015
    Сообщения:
    30
    Симпатии:
    4
    Делфи приницпиальный выбор? Пиши с помощью нескольких потоков и будет счастье, но в разные файлы тогда уж...