Qt - 如何为多部分下载器保存下载的数据

问题描述 投票:0回答:2

我正在用 Qt 编写一个多部分下载器。多个带有 http 标头“Range”的

QNetWorkRequest
用于下载文件。现在我将每个部分(
QNetworkReply
)接收到的数据写入file.part1,file.part2等

是否可以同时向同一个文件写入数据?我是否必须为其实现锁定?哪种是在应用程序中保存数据的最佳方法?

有什么建议吗?

qt multipart download-manager qfile
2个回答
0
投票

为什么不在完成后合并文件部分呢?您可以轻松地将部件写入

QFile
。也许有关方法或数据的某些事情会阻止您这样做,但如果可以的话,这可能是我在将
QFile
视为共享资源之前会采取的方法。

如果您希望多个并发回复能够写入和访问

QFile
,那么可以,
QFile
成为共享资源。据我所知,你需要锁定它。那时,您有多种选择。您可以让处理回复的插槽尝试获取
QSemaphore
,如果您希望锁定互斥锁,则可以使用
QMutex
QMutexLocker
。如果您想走这条路,您可以将其视为多个生产者(各种 QNetworkReplys)单个消费者(无论写入文件的内容)问题(这里有一个 Stack Overflow 帖子,提供了一些有用的链接)。简而言之,这里有很多方法,我认为所有这些方法都比简单地在最后合并
file.part
更麻烦,如果你能够走那条路的话。

就同时合并到单个

QFile
而言,可能有一种更简单的Qt方法,但我从未找到过。如果存在这样的方法,也许其他人可以插话。

我不确定您所说的“在我的应用程序中保存数据的最佳方式是什么?”是什么意思?您是指以持久的方式保存应用程序特定的设置吗?如果是这样,请查看

QSettings
。如果您指的是保存正在下载的数据,我可能会将其写入
QFile
,就像您所做的那样。尽管如果不了解有关您正在下载的内容的更多信息,就很难确定。


0
投票

“Qt 方式”将是事件驱动方式 - 每个下载器线程对象都可以通过排队连接将其下载的缓冲区发送到单个文件写入器线程对象,无需添加更多锁定,只需利用 Qt 已经支付的锁定即可.

做任何更细粒度或性能优化的事情都是非常多余的,除非您的网络速率大大超过了存储的速度。

可能值得一提的是,保持写入块的大小合适,如果您确实内存有限,我建议至少 32k 或 64k,较小的块可能会在 CPU 时间、较差的存储性能、过多的文件碎片和最不可取的——写放大。

© www.soinside.com 2019 - 2024. All rights reserved.