首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何有效利用10+计算机导入数据

如何有效利用10+计算机导入数据
EN

Stack Overflow用户
提问于 2011-04-12 08:01:14
回答 8查看 463关注 0票数 9

我们有大于200,000,000行的平面文件(CSV),我们将其导入到一个包含23个维度表的星型模式中。最大的维度表有300万行。目前,我们在一台计算机上运行导入过程,大约需要15个小时。因为时间太长了,我们想用40台电脑来做进口。

我的问题

如何有效地利用40台计算机进行导入。主要担心的是,在所有节点上复制维度表将花费大量时间,因为它们需要在所有节点上保持相同。这可能意味着,如果将来我们使用1000台服务器进行导入,由于服务器之间广泛的网络通信和协调,它实际上可能比使用单个服务器慢。

有人有建议吗?

编辑:

以下是CSV文件的简化:

代码语言:javascript
运行
复制
"avalue";"anothervalue"
"bvalue";"evenanothervalue"
"avalue";"evenanothervalue"
"avalue";"evenanothervalue" 
"bvalue";"evenanothervalue"
"avalue";"anothervalue"

导入后,表如下所示:

dimension_table1

代码语言:javascript
运行
复制
id  name
1   "avalue"
2   "bvalue"

dimension_table2

代码语言:javascript
运行
复制
id  name
1   "anothervalue"
2   "evenanothervalue"

事实表

代码语言:javascript
运行
复制
  dimension_table1_ID       dimension_table2_ID
    1                      1
    2                      2
    1                       2
    1                       2              
    2                       2
    1                       1
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-04-12 08:17:51

将CSV数据加载到数据库中很慢,因为它需要读取、拆分和验证数据。

所以你应该尝试的是:

  1. 在每台计算机上设置一个本地数据库。这将消除网络延迟。
  2. 在每台计算机上加载数据的不同部分。试着给每台计算机一个相同的块。如果由于某种原因这并不容易,请给每台计算机10,000行。当他们完成后,给他们下一块。
  3. 使用DB工具转储数据
  4. 将所有转储加载到单个DB中。

确保加载器工具可以将数据导入已经包含数据的表中。如果无法做到这一点,请查看DB文档中的“远程表”。许多数据库允许在本地显示来自另一个DB服务器的表。

允许运行像insert into TABLE (....) select .... from REMOTE_SERVER.TABLE这样的命令。

如果您需要主键(而且您应该这样做),那么在导入到本地DB期间,您也会遇到分配PKs的问题。我建议将PKs添加到CSV文件中。

检查编辑后的编辑,下面是您应该尝试的内容:

  1. 编写一个小程序,提取CSV文件的第一列和第二列中的唯一值。这可能是一个简单的脚本,如: 裁剪-d;“-f1排序-u \ nawk‘{ print”;“$0}” 这是一个相当便宜的过程(几分钟,甚至对于巨大的文件)。它会给你ID值文件。
  2. 编写一个程序,读取新的ID值文件,将它们缓存在内存中,然后读取巨大的CSV文件并用ID替换值。 如果ID值文件太大,只需对小文件执行此步骤,并将大文件加载到每台机器的所有40个数据库中。
  3. 将巨大的文件分割成40块,并在每台机器上加载它们。 如果您有巨大的ID值文件,您可以使用在每台机器上创建的表来替换所有剩馀的值。
  4. 使用备份/还原或远程表合并结果。 或者,更好的是,将数据保存在这40台机器上,并使用并行计算中的算法来分割工作并合并结果。这就是谷歌如何在几毫秒内从数十亿网页中创建搜索结果的方法。

在这里作一个介绍

票数 3
EN

Stack Overflow用户

发布于 2011-04-26 22:10:34

您可以考虑使用64位哈希函数为每个字符串生成一个bigint ID,而不是使用顺序ID。

使用64位哈希码,您可以在哈希表中存储2^(32 - 7)或超过3,000万项,然后才有0.0031%的可能发生冲突。

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

您甚至可以增加位数以进一步降低碰撞的可能性;只是,您无法使结果哈希适合于64位整数数据库字段。

请参见:

哈希

http://code.google.com/p/smhasher/wiki/MurmurHash

http://www.partow.net/programming/hashfunctions/index.html

票数 10
EN

Stack Overflow用户

发布于 2011-04-12 08:05:57

这是一个非常普遍的问题,不考虑数据库后端。在数据库后端上使用40或1000台无法处理负载的机器触发将不会给您带来任何好处。这样的问题是,要想在特定的way..you中回答这个问题,首先应该与您的组织中拥有足够的DB级别技能的人员联系,然后再提出一个更具体的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5632127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档