我想编写一个可以处理大量数据的应用程序(例如,多年的价格数据)。数据可以来自文件服务器,Web等,但其中的想法是,它一次只能容纳在计算机的内存中。当我处理数据时,我会将结果写出来(比方说,写入磁盘),然后我可以丢弃数据。
我在F#工作,所以有关.NET的反馈最有帮助。我不需要有具体的答案,只需指出在这个问题领域的良好阅读将非常感激。
是否有针对此的设计模式或工具包?它似乎与数据流编程类似,因为我只希望同时处理部分可用数据,除了与数据流编程不同,我想拉入数据而不是等待它到达然后做出反应。
我也想对这些数据进行并行处理。我目前正在考虑构建这个的方式是: 一个。每个线程都要求使用一些数据。 湾数据读取器可以将所请求数据的大块数量拉入计算机内存中。当线程完成此块时,可以拉入另一个块并缓存。 C。数据读取器还知道当前缓存了哪些块,因此如果多个线程请求相同的块,则它们都可以从相同的缓存中读取(它们不必写入它)。 同样,是否有.NET数据结构或设计模式?
最后,所有这些工作只是过度设计轮子吗?例如,尝试将整个数据流吸入数组或散列并让操作系统分页担心我上面描述的问题会更好吗?
我想SQL Server处理这样的问题,但我想要读取的数据可能不在数据库中,我宁愿不引入对SQL Server的依赖。我也知道F#有延迟评估数据的序列,但我不确定是否适用于数据的随机访问 - 即我可能想要从整个流中的任何位置获取数据,并且只有从那一点开始我才会按顺序访问它。
答案 0 :(得分:3)
使用.NET中的Stream类似乎可以很好地回答主要问题。流可以在几乎任何内容(内存,文件,网络等)上实现。因此,如果您编写代码以从流中读入并写出到不同的流,则可以更改读取或写入实现而无需更改其余的代码。
就并行处理而言,我假设大文件中存在“记录”概念。如果是这种情况,并且因为您正在使用F#,那么您应该只能在流上创建迭代器,然后使用F#的并行功能来处理每条记录。
答案 1 :(得分:1)
我会使用主/从设计模式,这是我认为你要去的地方2.不要让操作系统页面的数据,你将有可怕的减速,你的应用程序永远不会完成。