背景
数据量太大,主存容纳不下怎么办?
有时候,尽管程序本身很小巧,但却得处理大量数据(比如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实现的一个简单的下载程序。我在示例中已经提取了关键部分讲解。
预告
下一篇,介绍资源文件,一个应用十分广泛的模式。
分享到:
相关推荐
侯捷 内存受限系统之软件开发,不用怎么介绍了吧,经典书籍啊 侯捷 内存受限系统之软件开发,不用怎么介绍了吧,经典书籍啊
数据中心作为应用基础设施的重要部分,需要同时支撑IPv4业务和IPv6业务,双栈部署是最重要的技术手段。...双栈部署涉及很多方面,由于受限文章长度,本次主要聚焦IPv6组网下的PXE装机及IPv6服务器双归冗余架构的实现。
Thinking Small The Processes for Creating Small Memory Software This paper describes some process patterns for teams to follow when creating software to run in limited memory....It is a draft version ...
在内存受限的情况下,将数据流按时序进行分割,且用B -树进 行区间分块索引,之后利用RFID数据流统计分布特性进行复杂事件查找与匹配,避免了频繁搜索外存,极大地 降低了I/O开销并提高了吞吐量。此外,进行了相关的...
适用于有限存储系统(即手持式和专用微型计算设备)的一组连贯且易于使用的模式。 包括C ++和Java中的示例。
Oracle 12c受限模式 只读模式 静默模式 延迟模式
为解决狭窄受限空间下掘进机数据传输问题,提出了基于数据采集平台的掘进机数据远程传输方案,从系统结构、软件设计方面进行了阐述。该方案以数据采集平台为基础,以无线通信的方式将掘进机数据传输至无线网络并经专用...
2 5.10用户查询借书信息 2 5.11用户查询罚款信息 2 5.12借书受限 2 六、小组总结 2 图书馆管理系统——课程设计全文共30页,当前为第2页。 图书馆管理系统——课程设计全文共30页,当前为第2页。 一、系统背景与概述...
UbuntuKylin14.04LTS系统初始配置——更新系统并安装版权受限程序.pdf
由于DRAM的功耗、容量密度受限于工艺瓶颈,无法满足内存计算快速增长的内存需求,因此研发人员将目光逐渐移向了新型的非易失性内存(non-volatile memory,NVM).由DRAM和NVM共同构成的异质内存,具有低成本、低功耗、高...
Hikyuu Quant Framework是一款基于C++/Python的开源量化交易研究框架,用于策略分析及回测(仅受限于数据,如有数据也可用于期货等)。其核心思想基于当前成熟的系统化交易方法,将整个系统化交易抽象为由市场环境...
11.3内存访问的模式 11.3.1 标记——清扫技术,使用标记位图和延迟清扫 11.3.2 节点复制垃圾收集 11.3.3 渐进式垃圾收集 11.3.4 避免读取 11.4 改进cache性能的标准方法 11.4.1 cache的容量 11.4.2 块大小 11.4.3 ...
BAT:一种资源受限DTN中的高效数据传输策略,深空通信中的资源受限的数据传输策略。
———————————————————————————————————————————————————— 第二步,修改客户端。 单机版中的连接字串符: 取消:CONN.OPEN "provider=Microsoft.jet.OLEDB.4.0;...
资源受限WEb服务 论文,内容较为清晰,可以感兴趣的读者下载。
物联网传感器的受限部署与数据采集关键技术研究_谢明山
iondb, IonDB,用于资源受限系统的key-value 数据存储 开发: 嵌入式设备: 你可能还对我们的姊妹项目( LittleD ) 感兴趣,它使用了 1kB 个内存或者更少的内存。这是什么"?目前在Arduino世界中,不存在一个关联的...
1、JVM内存受限为5M,现在需要统计一份文件(文件大小为2G)里出现频次较高的top100的单词,请写出代码,并给出最优解 解法思路,统计每个单词出现的次数(创建以单词命名的文件,把出现次数写到文件中),再维护一...