2012-01-03 146 views
1

如何读取qt中大于600mb的文件? 我想使用file.readAll()读取文件。它可以处理小文件。但它会在大文件中产生bad_alloc错误?我该怎么办?尝试读取qt中的大文件时发生bad_allock错误

+1

请指定您正在执行此操作的平台。 – unwind 2012-01-03 16:32:19

+0

我可以问你在装载600Mb数据时会发生什么 - 我希望用户不要操纵或浏览,因为它肯定会对任何与用户相关的交互效率低下无效。与加载大文件有关的问题几乎总是指出需要解决不同的问题,以防止随着时间的推移进入更深更深的洞。分而治之... – 2012-01-04 09:19:14

+0

我正在使用Qt创建者(C++)。 – zi0408 2012-01-04 09:46:25

回答

1

不要这样做。

很少有必要在一次操作中将大文件加载到内存中。

您无法为用户导航或操作加载这么多信息,因此,如果我怀疑您只是充当光盘上的文件和将文件发送到其他位置之间的中介,那么请使用一种机制将Qfile视为QIODevice,而不是将其完全加载为QString或QByteArray。

如果您(或您的客户)在Windows上使用32位系统,但可能拥有超过2Gb的RAM,则可能需要了解/LARGEADDRESSAWARE链接器选项,该选项可以支持您地址大于2Gb,如果你确实无法将文件加载到内存中,那么可能会也会改善您的情况。

+0

嗨罗杰Attrill。其实我想读整个文件并上传到服务器。我试图开发上传器(客户端到服务器)。我考虑以块读取文件。但QNetworkAccessManager不提供分块传输。 – zi0408 2012-01-04 09:58:42

+0

[QNetworkAccessManager :: post](http://developer.qt.nokia.com/doc/qt-4.8/qnetworkaccessmanager.html#post)除了QByteArray版本之外还有一个QIODevice选项 - 不会避免加载文件第一? – 2012-01-04 10:16:53

1

考虑以块为单位读取文件,而不是一次全部读取。当然,您的目标可能是在文本编辑器中显示整个文件,在这种情况下,部分加载会更复杂。你很模糊,所以很难更具体。

2

尝试增加

QMAKE_LFLAGS += -Wl,--large-address-aware 

到你的Qt亲文件,从我的理解它会允许一个进程超过2GB积累更多的内存。

+0

是的,但只在x64的Windows上。并假设使用MinGW。 – vsizikov 2013-02-02 21:39:14

相关问题