Russian Qt Forum
Ноябрь 25, 2024, 10:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFile медленная запись в файл  (Прочитано 7474 раз)
merke
Гость
« : Ноябрь 18, 2010, 12:13 »

Всем привет!

Столкнулся со следующей проблемой:

Нужно заполнить файл нулями например:

Код:
for (int i = 0; i < 1168874 ;i++)
    {
        file.write("0");
    }

Запись идет очень долго! Как оптимизировать данный код, как ускорить заполнение файла?

Буду рад помощи!
Записан
alexman
Гость
« Ответ #1 : Ноябрь 18, 2010, 12:31 »

Попробуй писать кусками!
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Ноябрь 18, 2010, 12:36 »

+1
Еще очень поможет bool QFile::resize ( qint64 sz ).
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
merke
Гость
« Ответ #3 : Ноябрь 18, 2010, 12:50 »

Спасибо!!!
Записан
merke
Гость
« Ответ #4 : Ноябрь 18, 2010, 18:24 »

вот сделал это так посмотрите, не замудренно ли?

   
Код:
QFile file("test.dat");
    file.open(QIODevice::WriteOnly|QIODevice::Append);
    QDataStream ds(&file);
    quint64 pos;
    quint64 chunck;
    quint64 razmer;
    //будущий размер файлв
    razmer = 10;

    QString dig;
    dig.append(QString::number(razmer));
    //Смотрим если размер будущего файла всего число до 9 байт включительно то пишем по одному нулю
    //если размер от 10 до 9 включительно то пищем блоком по 10 нулей и т.д.
    if (dig.size() == 1)       chunck = 1;
    else if (dig.size() == 2)  chunck = 10;
    else if (dig.size() == 3)  chunck = 100;
    else if (dig.size() == 4)  chunck = 1000;
    else if (dig.size() == 5)  chunck = 10000;
    else if (dig.size() == 6)  chunck = 100000;
    else if (dig.size() == 7)  chunck = 1000000;
    else chunck = 1000000;

    char *t;
    t = (char*) malloc (chunck+1);
    //заполняем массив нулями исходя из полученного нами выше количества нулей
    for (int i = 0; i<chunck;i++)
        t[i] = '0';
    //позиция с нулевого байта
    pos = 0;
    while (pos < razmer)
    {
        int blocksize = qMin(chunck, razmer-pos);
        t[blocksize] = '/0';
        ds.writeRawData((char*)t,blocksize);
        pos+=blocksize;
    }
    free (t);
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Ноябрь 18, 2010, 18:26 »

Оу, ё.

Если никто не ответит, через пару часов напишу как надо.
« Последнее редактирование: Ноябрь 18, 2010, 18:29 от Пантер » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
merke
Гость
« Ответ #6 : Ноябрь 18, 2010, 18:38 »

спасибо!!!  но код то рабочий)))  или можно всё проще сделать? Подмигивающий
Записан
merke
Гость
« Ответ #7 : Ноябрь 18, 2010, 18:55 »

Пантер, буду очень ждать!
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Ноябрь 18, 2010, 20:28 »

Код
C++ (Qt)
void createFile (const QString& fileName, const int64 fileSize, const char fillChar = 0) {
 QFile file (fileName);
 file.open (QIODevice::WriteOnly);
 file.resize (fileSize);
 
 int bufferSize = 1024;//1 KB or fileSize //Replace to needed
 if (bufferSize > fileSize) {
   bufferSize = fileSize;
 }
 
 int64 writedData = 0;
 while (writedData != fileSize) {
   const int64 remainingSize = fileSize - writedData;
   if (remainingSize < bufferSize) {
     bufferSize = remainingSize;
   }
   QByteArray buffer (bufferSize, fillChar);
   writedData += file.write (buffer);
 }
}
 
Вроде, так. Не проверял, писал под пивом, так что могут быть ошибки. Улыбающийся
Да, всякие проверки на ошибки открытия/записи упустил для наглядности.
---------------------------------------------------
QByteArray buffer лучше создать и заресайзить до цикла и в нужный момент отресайзить его на оставшееся пространство.
« Последнее редактирование: Ноябрь 18, 2010, 21:21 от Пантер » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
merke
Гость
« Ответ #9 : Ноябрь 19, 2010, 03:31 »

спасибо огромное, Пантер!!! Выручил!!!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.094 секунд. Запросов: 23.