【发布时间】:2011-04-13 17:45:30
【问题描述】:
考虑以下用例:
我想并行遍历 2 个 db 表,并在任一表中找到差异和差距/缺失记录。假设1)table的pk是一个Int ID字段; 2)表格按ID顺序读取; 3) 任一表中可能缺少记录(具有相应的序列间隙)。
我想在每个 db 上一次执行此操作 - 使用惰性读取。 (我的这个程序的初始版本使用序列对象和数据读取器 - 不幸的是对每个数据库进行了多次传递)。
我曾考虑使用成对序列处理并在迭代中使用 Seq.skip 来尝试保持表处理同步。但是显然这非常慢,因为我 Seq.skip 的开销很高(在引擎盖下创建新序列),所以这可能是一个大表(比如 200k 记录)的问题。
我想这是一种常见的设计模式(比较来自不同来源的并发数据流),并且对反馈/cmets/类似项目的链接感兴趣。
有人愿意发表评论吗?
【问题讨论】:
-
你能分享一个代码示例,以便我们改进它吗?
-
您意识到最快的方法是在数据库内部?通过消除通过网络传输所有数据的需要,您通过算法改进获得的任何速度节省都将相形见绌。
-
@hova:我描述的场景过于简化,可能会产生误导。此处的实际用例由不同数据库中的相似表组成,这些表需要在数据迁移项目期间进行比较(例如,从 Access Db 转换为 Postgres 或 MySQl)。您还可以扩展此场景以处理来自各种外部(可能是远程)数据源(例如 Excel 文件、csv 文件、日志文件、XML 等)的数据。所以这里的目标是解决更一般的情况。
-
您是在寻找 id 的差距、列值的差异,还是两者兼而有之?
-
以上所有 - 假设您的工作是验证桌面数据库和 Oracle、Sql Server 之间的数据转换项目,您需要了解所有差异 - 迭代/序列处理只是这里的冰山一角。
标签: f# stream iteration f#-data lazy-sequences