2012-03-14 705 views
4

我将在Qt项目中使用二进制文件,并且对于Qt有点新颖,我不确定我是否应该使用QVector<quint8>QByteArray来存储数据。这些文件可能非常小(< 1MiB)或非常大(> 4GiB)。直到运行时才知道大小。在Qt中读取和写入二进制文件

我需要能够随机查找并能够处理文件中每个字节的操作。内存映射文件在这里有什么用处?

谢谢你的任何建议。

回答

4

将大文件加载到内存中,无论是QVector还是QByteArray可能都不是一个好的解决方案。

假设文件有某种结构的,你应该使用QFile::seek在的“历史记录”的开始自己的位置,并使用qint64 QIODevice::read (char * data, qint64 maxSize)同时在您选择的缓冲区读取一个记录。

3

QIODevice::write对于QByteArray有过载如果这会影响您的决定。 QDataStream可能值得关注更大的数据。在一天结束时,由于各种容器可以工作,所以真的取决于你。

编辑:

我认为基本的文件I/O使用你喜欢的任何缓冲可能是你所需要的。使用诸如QFile,QDataStream,QByteArray等的对象。您可以使用循环缓冲区仅读取和处理文件的部分内容,以节省内存,尤其是在处理音频,视频或其他适用于流的内容时。如果像XML,CSV等文件存在已知的结构,那么也可以使部分读取和处理更容易,因为您可以逐行或按标记进行标记。

内存映射文件使用虚拟内存来实现更快的I/O,通过在虚拟内存段中基本上创建磁盘上的文件副本,然后该应用程序就能够像使用进程内存那样使用该虚拟内存段。能够将文件当作进程内存使您能够进行适当的编辑,这比从文件开头寻找位置更快,并且比制作操作系统相关API调用和处理硬盘读/写更快。这对于内存映射文件而言通常会有相当大的开销,并且可能存在一些限制,具体取决于在目标平台中如何实现分页或您使用的是哪种体系结构。在Qt中,你将不得不设计自己的对象来使用内存映射文件,历史上我相信linux系统比windows更好地支持这个功能。

+0

如果我将整个文件读入QVector或QByteArray不会消耗大量内存? – nerozehl 2012-03-14 23:04:51

+0

是的,据我所知,Qt没有内存映射文件的构造,所以我认为你会推出自己的。就像所有的东西都需要考虑权衡一样。请参阅答案中的其他意见。 – AJG85 2012-03-15 15:32:36