Nano Hash - криптовалюты, майнинг, программирование

«Память заполнена» при передаче большого файла с использованием QTcpSocket

Я пытаюсь передать большой файл неблокирующим образом, подключив bytesWritten к моей функции sendNextBlock.

void AsynchronousRetrieveCommand::start()
{
    connect(socket(), SIGNAL(bytesWritten(qint64)), this, SLOT(sendNextBlock()));
    sendNextBlock();
}

void AsynchronousRetrieveCommand::sendNextBlock()
{
    socket->write(file->read(64*1024));
}

Я запускаю этот код на телефоне Symbian, и после передачи 5-6 мегабайт я получаю окно сообщения «Память заполнена» в телефоне и это сообщение в выводе отладки:

[Qt Message] CActiveScheduler::RunIfReady() returned error: -4

Я предполагаю, что это какая-то утечка памяти, но я не вижу, что ее вызывает в моем коде.


  • Насколько велик файл, который вы отправляете? 16.12.2012
  • Около 500 МБ, но ошибка возникает после того, как было передано всего 5 МБ. Но это все равно не должно иметь значения, потому что я отправляю его блок за блоком, а каждый блок всего 64k. 16.12.2012

Ответы:


1

Хорошо, оказалось, что буфер сокета неконтролируемо растет, потому что данные передаются в него быстрее, чем он может быть сброшен.

Я исправил проблему, проверив значение, заданное bytesWritten, и записав только определенное количество байтов (по сути, перезаполнив буфер до 64 КБ).

Мой фиксированный код теперь выглядит так:

void AsynchronousRetrieveCommand::start()
{
    connect(socket(), SIGNAL(bytesWritten(qint64)), this, SLOT(sendNextBlock(qint64)));
    sendNextBlock(64*1024);
}

void AsynchronousRetrieveCommand::sendNextBlock(qint64 bytes)
{
    socket()->write(file->read(bytes));
}
16.12.2012
  • Вам не хватает некоторой обработки ошибок, лучше используйте ( char*, qint64) перегрузки чтения/записи и проверьте возвращаемое значение, чтобы убедиться, что данные действительно были прочитаны/записаны. 16.12.2012
  • Я предполагал, что если я не смогу прочитать файл, то QFile::open в первую очередь потерпит неудачу (и у меня есть проверки для этого) 16.12.2012
  • read/write((const) char*, qint64) возвращает количество прочитанных/записанных байтов. Отсутствие проверки возвращаемого значения может привести к потере данных. Кроме того, после открытия файла чтение/запись все еще может завершиться ошибкой (тогда возвращается -1). 16.12.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..