背景
数据量太大,主存容纳不下怎么办?
有时候,尽管程序本身很小巧,但却得处理大量数据(比如BT客户端)。这种情况意味着,尽管程序本身可以进入主存,但是数据却耗费了太多内存。
模式
因此,我们应当一次只处理一部分数据;其余放在辅助存储设备中内。
更深入的探讨
我们可以利用循序访问或随机访问读取IO流中的每一笔数据并进行处理,再把处理完毕的数据循序写回一个或多个文件。
这个模式并不是很复杂,适用的场景也非常广泛,但是我们应当清楚该模式的局限。
首先分批处理数据会增加实现的局部复杂性。
其次,需要额外的环境信息以便处理数据(比如链接程序)。
再次,读取多个小型数据项往往比读取一份大型数据项效率要低。
最后,如果对数据有一些要求(比如要求从文件读取10000个数值,在输入之前应当先对这10000个数值排序),那么使用该模式则会增加系统的复杂度,降低可用性。
实现
实现该模式的方法主要有三种:
1.增量处理
这是最简单也是最常见的一个方法,即从IO流循序读入整个文件,并将处理结果循序写入另一个文件。一般来说,这种方法适用于输入也是按序的场景:比如HTTP下载、读取用户输入等等。
2.子文件处理
如果不以循序方式处理文件,也可以将数据划分为多个小型文件。此时,还需要单独编写一个程序用来处理生成的每一个小文件然后将这些小文件合并为一个大文件。
然而,数据的划分并不是那么容易,大多数情况下,需要额外的信息来记录划分的边界。
3.随机访问
当然,你也可以随机访问某一个文件。比如,在UNIX下,你可以使用lseek()函数在文件中定位。使用这种方法也需要额外的环境信息用以记录一些信息,比如UNIX中的文件描述符。
示例
1.增量处理
以下是QT的一个例子(只截取了部分代码)
void HttpWindow::startRequest(QUrl url)
{
reply = qnam.get(QNetworkRequest(url));
connect(reply, SIGNAL(finished()),
this, SLOT(httpFinished()));
// 连接信号与槽,即每当有新的输入时就发射readyRead信号,触发httpReadyRead槽
connect(reply, SIGNAL(readyRead()),
this, SLOT(httpReadyRead()));
connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
this, SLOT(updateDataReadProgress(qint64,qint64)));
}
然后来看我们是如何实现私有槽httpReadyRead的:
void HttpWindow::httpReadyRead()
{
// 每次有新数据就写入一次,这样可以减少对RAM的需求。
if (file)
file->write(reply->readAll());
}
2.子文件处理
编译器是子文件处理的一个典型应用。用户把大型程序分解为多个文件,编译器逐一处理,然后链接器将所有的.o文件合并为一个可执行程序:
gcc -c foo1.c -o foo1.o
gcc -c foo2.c -o foo2.o
gcc foo1.o foo2.o -o foo
3.随机访问
参考UNIX文件IO的一些例子即可。不再赘述。
附件
附件中是使用QT实现的一个简单的下载程序。我在示例中已经提取了关键部分讲解。
预告
下一篇,介绍资源文件,一个应用十分广泛的模式。
分享到:
相关推荐
综上所述,"安全卫士"通过全面的功能设计,从内存管理、后台应用控制、系统优化、文件整理、安全防护、网络优化等多角度出发,实现手机的高效运行和流畅体验。对于开发者而言,理解并实现这些功能,不仅能提升用户...
XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用在数据交换、配置文件、文档存储等领域。XML解析器是处理XML文档的核心工具,它读取XML文档并将其转换为程序可以理解的形式。Xerces-J是Apache...
- 在资源受限的环境下,选择内存占用低、挂载速度快的文件系统。 - 定期监控文件系统的健康状态,必要时进行修复或更换。 通过上述分析可以看出,jffs2、yaffs2和ubifs各有优势,适用于不同的应用场景。开发者应...
本文提出了一种新的分布式内存抽象概念——**弹性分布式数据集(RDD)**,该概念旨在结合MapReduce等数据流模型的容错特性,同时允许开发人员在大型集群上执行基于内存的计算。与现有数据流系统相比,RDD特别适用于...
这降低了对内存的需求,对于内存受限的环境特别有用。 HMAC(Hash-based Message Authentication Code)是另一种安全机制,用于验证数据的完整性和来源。它通过将一个密钥与数据的哈希值相连接生成一个认证码。如果...
如果文件很大,内存受限,SAX或StAX更适合;若追求简单易用且文件大小适中,JDOM可以考虑。 现在让我们看看两个示例文件:“actor_info.xml”和“book.xml”。这些文件可能分别包含了演员信息和书籍信息,例如: -...
- **模式演化**:支持在不影响现有数据的情况下更新数据模型。 - **数据库备份与压缩**:提供数据库备份功能和压缩技术来优化存储空间。 - **XML导入/导出**:支持将数据库内容导入或导出为XML格式。 - **数据库...
11. **DDS_XRCE(eXtremely Resource Constrained Environments)**:XRCE针对资源受限环境设计,如嵌入式设备,它提供了一种轻量级的客户端实现,以适应低功耗和低内存的硬件。 12. **DDS4CCM(Concurrent ...
这些系统通常具有资源受限的特点,例如较低的处理能力、较少的内存以及较小的存储空间。嵌入式Linux凭借其灵活性和可定制性,成为了嵌入式系统开发的理想选择。 **1.1.1 Linux发展概述** - **起源与发展:** - ...
在DOS环境下,由于工作在实模式下,程序员能够直接寻址1MB的物理内存,通过段寄存器来定位段的起始地址,每段最大为64KB。对于超出1MB的内存,则只能作为扩展内存使用,主要用于数据存储而非执行代码。 然而,...
《电脑维修手册——联想员工内部指导》是一份深入解析电脑硬件和软件问题的宝贵资源,专为联想员工设计,但也适用于广大电脑用户和爱好者。这份手册涵盖了从基础诊断技巧到高级故障排除策略的广泛知识,旨在帮助用户...
7. **内存管理**:对于嵌入式系统或资源受限的平台,优化解码程序可能还需要关注内存占用,确保在低内存环境下也能流畅运行。 BladeENC作为一款古老的编码工具,其解码器部分可能已经不能满足现代需求。然而,了解...
- 在这种模式下,数据的高位字节存储在较低的内存地址中。 - ARM处理器支持大端模式。 2. **小端模式**: - 在这种模式下,数据的低位字节存储在较低的内存地址中。 - ARM处理器也支持小端模式。 综上所述,本...
- **安全模式**:如果在正常启动模式下无法运行Ghost,可以尝试在安全模式或命令提示符下运行。 - **验证备份**:备份完成后,建议进行验证操作,确保备份文件的完整性和可用性。 - **恢复过程**:在恢复系统前,...
开发者需要考虑功耗、实时性、稳定性等因素,确保系统能够在受限的资源条件下稳定运行。 5. **数字音频处理**:虽然ISD1700芯片内部处理音频信号,但开发者可能需要处理音频数据的采集和格式转换。这涉及到数字信号...
在实际应用中,用户需注意,尽管"nero_test v2.5.5"是一款强大的磁盘光驱工具,但它的性能受限于硬件设备,如光驱的读写速度、电脑的处理器性能和内存大小等。此外,随着蓝光等高容量光盘的出现,用户应确保光驱支持...
从给定的文件信息中,我们可以提取出关于HSQLDB的多个重要知识点,这些知识点涵盖了HSQLDB的基本介绍、运行模式、SQL支持、高级话题以及部署和管理等关键领域。 ### HSQLDB —— 轻量级纯Java关系型数据库 HSQLDB...
通过“SmartTicket”这个端到端的J2ME应用开发实例,我们不仅可以了解到如何利用MIDP和J2EE技术栈构建复杂的移动商务系统,还能够学习到在资源受限的环境下进行高效编程的方法。此外,本实例还涉及到了设计模式的...
它将复杂的日志数据转化为直观的图表,使开发者能够快速理解GC的工作模式和潜在问题。 GCLogViewer支持JDK1.6及以上版本,这意味着即使在较老的环境中,开发者也能利用该工具进行性能分析。对于那些需要维护旧项目...
3. **资源限制**:在资源受限的环境中(如移动设备或嵌入式系统),SAX或XPP由于较低的内存消耗和更快的处理速度通常更为适用。 4. **编程习惯**:DOM提供了更接近面向对象的编程风格,而SAX和XPP则更加面向事件和...