【发布时间】:2016-09-05 16:39:30
【问题描述】:
简化问题:我有两个不能使用字符串数组存储在内存中的大文件,也不能使用 except 方法,因为它也会将文件数据推送到内存中。我的目标是比较两个大文件并找出差异,但我无法通过将其中一个大文件加载到内存中来做到这一点。有没有好的流式阅读器逐行解决方案或其他方法来做到这一点?
长问题: 我有两个文件 1.SQL查询数据 2. 物理数据
SQLQueryData 包含数据库中列出的文件的名称(例如:Recording01.wmvAudiofile01.wmaTestrecording.wmv 等)
PhysicalData 是物理 HDD 上的目录搜索,以获取那里存在的文件名(这应该包含与 SQLQueryData 相同的信息)。
我特意从他们的目录中删除了该测试的文件,并创建了数百万个测试名称。 SQLQueryData 文件为 700MB,PhysicalData 约为 650MB。
我首先尝试了string[] readfile = file.readalllines,但这会导致内存不足错误。
我也对这两个文件尝试了IEnumerable<String>,但这会导致
系统内存不足错误
因为它将两个文件都放入内存中,这很容易占用大约 2GB 的内存。
我的下一个尝试是只将一个文件加载到内存中,然后使用流读取器将单行 SQLQueryData 与 PhysicalData 的字符串数组进行比较,但这也会导致内存不足错误。
我尝试将流读取器嵌入到另一个流读取器中,但我在网上看到的唯一方法或示例是 IF 语句,说明流读取器的 line1 = line2 是否写入该数据。我不想写line1=line2,我需要知道PhysicalData是否不包含SQLQueryData信息。
我正在考虑使用一种提取方法,例如如果line1=line2,则从文件中提取该行,但我不知道如何在代码中编写。
有人知道按照我的要求去做吗?
【问题讨论】:
-
您能否将文件逐行加载到 SQL 数据库中。并使用 SQL 进行比较?
-
区分不是一项微不足道的任务。您是否考虑过缺少的行以及如何以及何时同步?
-
文件是否已排序?您可以将查询输出文件替换为与数据库的物理连接吗?您是否有能力向数据库添加索引,或者是否有适当的索引?能否实现合并排序,以便对文件进行排序?
-
不幸的是,这些文件没有排序。我正在制作一个我必须做的项目的真实示例。我们有一个包含多个文件名的数据库,这些文件名不按顺序排列,并且在 HDD 上缺少数据文件。我的目标是找出丢失的文件并专门报告这些文件。不幸的是,由于这是现实世界,我们正在谈论数百万个文件。
标签: c# compare ienumerable