Russian Qt Forum

Qt => Общие вопросы => Тема начата: merke от Ноябрь 18, 2010, 12:13



Название: QFile медленная запись в файл
Отправлено: merke от Ноябрь 18, 2010, 12:13
Всем привет!

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

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

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

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

Буду рад помощи!


Название: Re: QFile медленная запись в файл
Отправлено: alexman от Ноябрь 18, 2010, 12:31
Попробуй писать кусками!


Название: Re: QFile медленная запись в файл
Отправлено: Пантер от Ноябрь 18, 2010, 12:36
+1
Еще очень поможет bool QFile::resize ( qint64 sz ).


Название: Re: QFile медленная запись в файл
Отправлено: merke от Ноябрь 18, 2010, 12:50
Спасибо!!!


Название: Re: QFile медленная запись в файл
Отправлено: merke от Ноябрь 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);


Название: Re: QFile медленная запись в файл
Отправлено: Пантер от Ноябрь 18, 2010, 18:26
Оу, ё.

Если никто не ответит, через пару часов напишу как надо.


Название: Re: QFile медленная запись в файл
Отправлено: merke от Ноябрь 18, 2010, 18:38
спасибо!!!  но код то рабочий)))  или можно всё проще сделать? ;)


Название: Re: QFile медленная запись в файл
Отправлено: merke от Ноябрь 18, 2010, 18:55
Пантер, буду очень ждать!


Название: Re: QFile медленная запись в файл
Отправлено: Пантер от Ноябрь 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 лучше создать и заресайзить до цикла и в нужный момент отресайзить его на оставшееся пространство.


Название: Re: QFile медленная запись в файл
Отправлено: merke от Ноябрь 19, 2010, 03:31
спасибо огромное, Пантер!!! Выручил!!!