【发布时间】:2011-08-14 20:35:24
【问题描述】:
我编写了一个执行 ETL 过程的 ETL 过程。 ETL 流程需要为 2 年的记录处理超过 100+ 百万或总共的行。为了避免内存不足的问题,我们将数据加载分块为每 7 天一次。对于每个chunk进程,加载所有需要的参考数据,然后进程打开sql连接,将源数据一一加载,转换,写入数据仓库。
分块处理数据的缺点是速度慢。
这个过程对于大多数表都运行良好,但有一个表我仍然遇到内存不足的情况。进程加载了太多参考数据。我想避免将数据分块到 3 天,以使其具有良好的性能。
是否有任何其他策略可以用来避免 OutOfMemoryException?
例如,本地数据库,将引用数据写入文件,生成另一个 .NET 进程以在 Windows 中占用更多内存,使用 CLR 存储过程进行 ETL...
环境:Windows 7 32 位操作系统。 4 GB 内存。 SQL Server 标准版。
唯一的解决方案是使用存储过程并让 SQL Server 处理 ETL。但是,我试图避免它,因为该程序也需要支持 Oracle。 我尝试的其他性能改进是添加索引以改进加载查询。创建自定义数据访问类以仅加载必要的列,而不是将整行加载到内存中。
谢谢
【问题讨论】:
-
一种选择是为“参考数据”创建一个固定大小的缓存。当您的程序需要参考数据时,它会在缓存中查找。如果它不存在,它会从您的 SQL 服务器加载它。这只有在参考数据中存在局部性时才有效。
标签: c# .net data-warehouse etl