Database med维度等。应用于所有数据(而不是一次一组)的业务规则现在也必须完成。这将是数据清理的“第二阶段” 同样,对每个worker数据库重复上述步骤,直到所有文件都已上载

Database med维度等。应用于所有数据(而不是一次一组)的业务规则现在也必须完成。这将是数据清理的“第二阶段” 同样,对每个worker数据库重复上述步骤,直到所有文件都已上载,database,star-schema,Database,Star Schema,优点: 从文件中读取/转换数据到数据库以及执行“第一阶段”清理可以跨N台计算机扩展 理想情况下,主数据库只剩下很少的工作(“第二阶段”,合并数据集) 限制: 大量数据首先读入工作者数据库,然后通过网络再次读取(尽管是DBMS本机格式) 主数据库可能是一个瓶颈。一切都要经过这里 快捷方式: 当工作站“签入”新文件时,它可能会刷新已加载到主数据库中的本地数据存储,并将基于此的数据清理考虑添加到其“第一阶段”工作中(即,它知道代码5484J已加载,因此可以将其过滤掉,而不将其传递回主数据库)

优点:

  • 从文件中读取/转换数据到数据库以及执行“第一阶段”清理可以跨N台计算机扩展
  • 理想情况下,主数据库只剩下很少的工作(“第二阶段”,合并数据集)
限制:

  • 大量数据首先读入工作者数据库,然后通过网络再次读取(尽管是DBMS本机格式)
  • 主数据库可能是一个瓶颈。一切都要经过这里
快捷方式:

  • 当工作站“签入”新文件时,它可能会刷新已加载到主数据库中的本地数据存储,并将基于此的数据清理考虑添加到其“第一阶段”工作中(即,它知道代码5484J已加载,因此可以将其过滤掉,而不将其传递回主数据库)
  • SQL Server表分区或其他RDBMS的类似物理实现技巧可能会得到很好的效果
  • 其他快捷方式也有可能,但这完全取决于所实现的业务规则

不幸的是,如果没有进一步的信息或对所涉及的系统和数据的了解,我们无法判断这个过程最终会比“一箱完成”解决方案快还是慢。归根结底,这在很大程度上取决于您的数据:它是采用“分而治之”技术,还是必须全部通过单个处理实例运行?

最简单的事情是让一台计算机负责分发新的维度项id。每个维度都可以有一个。如果维度处理计算机位于同一网络上,则可以让它们广播id。这应该足够快了

你计划在23维星图中使用什么数据库?导入可能不是唯一的性能瓶颈。您可能希望在分布式主内存系统中执行此操作。这避免了许多物质化问题

您应该调查是否存在高度相关的维度

一般来说,对于一个具有大维度的23维星型方案,标准关系数据库(SQL Server、PostgreSQL、MySQL)在数据仓库问题上的表现将非常糟糕。为了避免进行全表扫描,关系数据库使用物化视图。有23个维度,你买不起足够的。分布式主存数据库可能能够足够快地完成全表扫描(2004年,我在Delphi中的奔腾43GHz上每线程扫描了大约800万行/秒)。Vertica可能是另一种选择

另一个问题:压缩文件时文件有多大?这为您可以执行的规范化量提供了一个良好的一阶估计


[编辑]我已经看了你的其他问题。这看起来与PostgreSQL(或MySQL或SQL server)不太匹配。您愿意等待查询结果多长时间

另一方面,您可以在Windows Server上使用Windows Hyper-V云计算插件:http://www.microsoft.com/virtualization/en/us/private-cloud.aspx

您可以考虑使用64位散列函数来生成每个字符串的<代码> BigIt< /Cord>ID,而不是使用序号IDS.< /P> 使用64位哈希代码,您可以在哈希表中存储2^(32-7)个或3000多万个项目,而不会出现0.0031%的冲突

这将允许您在所有节点上拥有相同的ID,“分派”和“合并”阶段之间的服务器之间没有任何通信

您甚至可以增加位的数量,以进一步降低冲突的可能性;仅此而已,您将无法使结果哈希适合64位整数数据库字段

见:

罗希塔

我建议您首先在数据库之外汇总数据,从而消除负载中的大量工作。我在Solaris unix环境中工作。我倾向于使用KornShell脚本,该脚本
将文件切割成更多可管理的块,然后将这些块平均分配给我的另外两台服务器。我会使用一个nawk脚本(nawk有一个高效的哈希表,他们称之为“关联数组”)来处理数据块,以计算不同的值(维度表)和事实表。只需将看到的每个新名称与该维度的增量关联,然后写出事实

如果您通过命名管道执行此操作,您可以在“主机”计算机坐在那里直接将数据加载到表中的同时“实时”推送、远程处理和回读数据

请记住,无论您如何处理200000000行数据(它有多少Gig?),都需要一些时间。听起来你是来找乐子的。阅读其他人如何提出解决这个问题的建议是很有趣的。。。古老的格言“有多种方法可以做到这一点!”从未如此真实。祝你好运


干杯。Keith.

您的实现似乎效率很低,因为它的加载速度低于1 MB/秒(50 GB/15小时)


在现代单服务器(2x Xeon 5690 CPU+RAM,足以满足哈希表中加载的所有维度+8GB)上的正确实现应该会使您的速度至少提高10倍,即至少10MB/秒。

我就是我们双人组织中的那个人。你能给我指一个让问题更具体的方法吗。目前我们还没有选择数据库引擎,这就是为什么我没有指定一个。我认为这是一个普遍的问题,因此我以一种通用的方式询问,以便其他人可以利用该解决方案,而不考虑数据库技术。我们对您的输入数据一无所知。我们不知道你是怎么死的
"avalue";"anothervalue"
"bvalue";"evenanothervalue"
"avalue";"evenanothervalue"
"avalue";"evenanothervalue" 
"bvalue";"evenanothervalue"
"avalue";"anothervalue"
id  name
1   "avalue"
2   "bvalue"
id  name
1   "anothervalue"
2   "evenanothervalue"
  dimension_table1_ID       dimension_table2_ID
    1                      1
    2                      2
    1                       2
    1                       2              
    2                       2
    1                       1
 cut -d";" -f1 | sort -u | nawk ' { print FNR";"$0 }'