【发布时间】:2012-12-10 14:10:23
【问题描述】:
我有一个数据库,速度不是很快,而且我有一个大约 65000 行的大 CSV。我需要交叉检查这些是否存在,并在需要时更新数据库。
- 在 CSV 中,有一列包含数据库 ID。这始终是一对一的关系。
- CSV 可能会保存数据库的新输入,因此可能会出现没有数据库条目的情况。
- 我无法遍历 CSV 并检查每一行,因为它太慢了。
- 首先从数据库中获取所有结果并每次都将它们存储以循环访问是行不通的,因为这会占用大量 RAM。
我怎样才能做到以下几点:
- 检查 CSV 中的行是否有数据库条目。如果是这样,请将其写入另一个 CSV 文件。
- 如果该行没有数据库条目,请将其写入其他文件。
- 将时间跨度保持在 5 分钟以内,最好更短。
CSV 有很多列(例如 70 列),但我只需要第 5 列来交叉检查 ID。我曾尝试先遍历 CSV 文件,然后用数据库检查它,但这太慢了。可能需要 10 多分钟。我还尝试从数据库中获取所有条目,并循环遍历这些条目。使用循环,运行 CSV(使用BufferedStream)并检查它。这确实显着减少了时间(最多 5 分钟),但将无法记录数据库中不存在的条目。
有什么办法可以在保持速度的同时做到这一点?
【问题讨论】:
-
是什么样的数据库?如果它是一个关系数据库并且数据库上的索引设置正确,那么通过表中的 id 进行选择/更新应该很快。
-
您对 CSV 有什么控制权?你能删掉出现在数据库中的记录吗?数据库 ID 列是否遵循您可以利用以节省时间的约定?例如你能删掉所有小于你添加到数据库中的最后一个 ID 的 ID 吗?
-
@JohnKoerner 这不是我的数据库,我无法编辑它。它对我来说是只读的。我想索引设置得不是很好,或者根本没有。我必须通过 ODBC 连接器进行连接。
-
@Rawrgramming CSV 是客户端。作为保护,我可以制作副本然后进行编辑,所以是的,我可以完全控制 CSV。虽然行没有排序,但 ID 可能会被打乱。
标签: c# database csv streamreader