我有一个大约 10 GB 的 *.csv 格式的大文件。这是不同地区从 1960 年至今的数据。我能够按区域分解文件。大约有 8000 个区域,我按区域拆分文件,所以我有 8000 个文件,每个文件大约 2 MB。
我想知道创建 Access 数据库系统以查找每个区域的数据的最有效方法是什么。是否通过:
按区域名称将文件分成小文件(即每个区域8000个文件)并导入它们以每次访问,或者
将它们分成大约 1 GB 的恒定大小并查询它们。
无论哪种情况,如何将文件导入 Access?
您可能知道,Access 数据库文件的大小限制为 2GB,因此您几乎肯定无法将所有信息保存在一个文件中。即使它只是勉强适合,将这么多信息保存在单个 Access 数据库文件中也可能会相当缓慢。
根据您数据的“形状”,Access 中可能存在其他限制,可能会在您的特定情况下造成困难。例如,一个表(或查询)被限制为 255 列。如果您还没有这样做,请先查看Access 规范,然后再进一步进行此操作。
无论如何,请考虑使用另一个数据库作为后端。对于 SQL Server Express Edition 中的单个数据库,您的数据甚至可能太大(我记得每个数据库的总大小最大为 10GB),但即使您必须将数据拆分为两个 SQL Express 数据库,处理起来也会更容易十几个(或更多?)访问数据库。
请记住,如果您使用不同的数据库后端,您仍然可以将 Access 用作查询和报告工具(通过 ODBC 链接表)。
根据您的描述,如果您永远不需要跨区域查询(并记住“从不”是一个很长的时间™),那么您的 8000 文件方法将是可行的。但是,我不一定建议您每次要运行查询时都导入相应的 CSV 数据。相反,我会从 Tom 和 HansUp 的答案中借用想法:
计划“A”:首先直接针对 CSV 文件本身运行查询,看看这是否足够快满足您的需求。您可以通过创建指向 CSV 文件的链接表并运行一些典型查询来进行测试。正如 Tom 所提到的,CSV 链接表无法被索引,所以如果您发现查询太慢,那么您可能不得不去计划“B”。
计划“B”:如果您确实需要导入 CSV 数据,那么您可能希望使用 HansUp 的建议DoCmd.TransferText
来帮助自动化流程。为每个查询导入特定的 CSV 文件似乎很浪费,因此您可以考虑创建 ~8000 个.accdb
文件,然后使用类似...的查询
strSQL = _
"SELECT * FROM TableName " & _
"IN ""C:\__tmp\region12345.accdb"" " & _
"WHERE StartDate BETWEEN #2013-05-10# AND #2013-05-15#"
...您的代码可以替代的地方
.accdb
基于感兴趣区域的适当文件的名称,以及
所需的日期范围。
如果您将使用 VBA 执行此操作,则可以使用DoCmd.TransferText 方法将 CSV 数据导入 Access。
不过,我不想在你的情况下这样做。10 GB 的数据太多,无法在 Access 中合理管理。如果您将其划分为单独的 db 文件,查询从多个 db 文件中提取的数据是具有挑战性且缓慢的。此外,如果查询的组合结果集达到 2 GB 访问限制,您将收到有关磁盘空间不足的令人困惑的错误。
对于 MS Access 中的数据存储而言,这不是一项合理的工作。
@Gords 和 @HansUps 是非常好的答案。为您的数据使用更好的后端。免费的将包括 SQL Express 和 MySQL。如果您在公司环境中,那么您可能拥有 MS SQL Server 的许可证。
但是,如果您坚持在严格的 Access 中执行此操作,这里有两个相关的想法。这两种想法都要求您根据需要链接和取消链接(使用 VBA)到您需要的数据。
您无需导入 CSV 文件即可将其视为表格。您可以像链接另一个数据库中的表一样链接到它。
或者,您可以将每个 CSV 文件转换为它自己的 Access DB(您可以使用 VBA 自动执行此操作)。然后,就像上面的建议一样,根据需要链接和取消链接表格。