我将在Qt项目中使用二进制文件,并且对Qt来说有点新,我不确定我是否应该使用QVector<quint8>
或QByteArray
来存储数据。文件可以非常小(<1MiB)或非常大(> 4GiB)。直到运行时才知道大小。
我需要能够进行随机搜索,并能够处理文件中每个字节的操作。内存映射文件在这里有用吗?
感谢您提出任何建议。
答案 0 :(得分:4)
将整个大文件加载到内存中,无论是QVector
还是QByteArray
,都可能不是一个好的解决方案。
假设文件具有某种结构,您应该使用QFile::seek
将自己定位在“记录”的开头,并使用qint64 QIODevice::read ( char * data, qint64 maxSize )
一次在一个缓冲区中读取一条记录选择。
答案 1 :(得分:3)
QIODevice::write
如果影响您的决定,则会QByteArray
超载。 QDataStream
可能值得寻找更大的数据。在一天结束时,由于各种容器都能正常工作,所以这取决于你。
修改强>
我认为使用您喜欢的缓冲区的基本文件I / O可能就是您所需要的。使用QFile
,QDataStream
,QByteArray
等对象。您可以使用循环缓冲区读取和处理文件的某些部分以节省内存,尤其是在处理音频,视频或其他内容时适合溪流。如果文件的已知结构(如XML,CSV等)也可以使部分读取和处理更容易,因为您可以逐行或逐个标记。
内存映射文件使用虚拟内存来实现更快的I / O,通过在虚拟内存段中的磁盘上创建一个文件的副本,然后该应用程序可以将其用作应用程序,就好像它只是进程内存一样。能够将文件视为进程内存允许您进行就地编辑,这比从文件开头寻找位置更快,而且比使用OS依赖的API调用和处理硬盘读/写更快。内存映射文件确实存在相当大的开销,并且存在一些可能的限制,具体取决于在目标平台中实现分页的方式或您正在使用的体系结构。在Qt中你必须设计自己的对象来使用内存映射文件,而且从历史上看,我相信linux系统比windows更能支持这个功能。