7

我正在处理存储在制表符分隔.tsv文件中的大量科学数据。要执行的典型操作是读取几个大文件,仅过滤掉某些列/行,与其他数据源连接,添加计算值并将结果写入另一个 .tsv。

纯文本因其健壮性、寿命和自记录特性而被使用。以另一种格式存储数据不是一种选择,它必须保持开放且易于处理。数据量很大(几十 TB),将副本加载到关系数据库中是负担不起的(我们将不得不购买两倍的存储空间)。

由于我主要进行选择和连接,我意识到我基本上需要一个带有基于 .tsv 的后备存储的数据库引擎。我不关心事务,因为我的数据都是一次写入多次读取。我需要就地处理数据,而不需要主要的转换步骤和数据克隆。

由于要以这种方式查询大量数据,我需要有效地处理它,利用缓存和计算机网格。

有谁知道一个系统可以提供类似数据库的功能,同时使用普通的制表符分隔文件作为后端?在我看来,这似乎是一个非常普遍的问题,几乎所有科学家都以一种或另一种方式处理。

4

7 回答 7

5

数据量很大(几十 TB),将副本加载到关系数据库中是负担不起的(我们将不得不购买两倍的存储空间)。

您比我们任何人都更了解您的要求,但我建议您再考虑一下。如果您将 16 位整数 (0-65535) 存储在 csv 文件中,您的 .tsv 存储效率约为 33%:存储大多数 16 位整数加上分隔符 = 6 个字节需要 5 个字节,而本机整数占用 2 个字节。对于浮点数据,效率更差。

我会考虑采用现有数据,而不是存储原始数据,而是通过以下两种方式处理它:

  1. 将其以众所周知的压缩格式(例如 gzip 或 bzip2)压缩存储到您的永久归档媒体(备份服务器、磁带驱动器等)上,这样您就可以保留 .tsv 格式的优势。
  2. 将其加工成具有良好存储效率的数据库。如果文件具有固定且严格的格式(例如,X 列始终是字符串,Y 列始终是 16 位整数),那么您可能处于良好状态。否则,NoSQL 数据库可能会更好(参见 Stefan 的回答)。

这将创建一个数据丢失风险低的可审计(但可能访问缓慢)存档,以及一个无需担心丢失源数据的快速访问数据库,因为您始终可以将其重新读入数据库从档案中。

您应该能够减少存储空间,并且不需要像您所说的两倍的存储空间。

索引将是困难的部分;您最好对需要能够有效查询的数据子集有一个很好的了解。

于 2010-07-29T21:40:39.533 回答
2

这些 nosql 数据库之一可能会工作。我非常怀疑任何可以配置为位于平面分隔文件之上。您可能会查看其中一个开源项目并编写自己的数据库层。

于 2010-07-29T21:00:05.670 回答
2

可扩展性始于制表符分隔的 ASCII 之外的某个点。

只是实用-不要学术化-惯例可以解放您的手指和思想。

于 2010-07-29T21:30:06.250 回答
1

如果您在 .NET 环境中,则可以使用 LINQ to Objects 执行此操作。流/延迟执行、函数式编程模型和所有 SQL 运算符。连接将在流模型中工作,但会拉入一个表,因此您必须将一个大表连接到一个较小的表情况。

塑造数据的便利性和编写自己的表达式的能力将真正在科学应用中大放异彩。

针对分隔文本文件的 LINQ 是 LINQ 的常见演示。您需要提供向 LINQ 提供表格模型的能力。谷歌 LINQ 获取一些示例的文本文件(例如,参见http://www.codeproject.com/KB/linq/Linq2CSV.aspx,http://www.thereforesystems.com/tutorial-reading-a-text-file-使用-linq/等)。

期待学习曲线,但它是解决您问题的好方法。关于该主题的最佳治疗方法之一是 Jon Skeet 的C# in depth。从 Manning 获取“MEAP”版本,以便提前访问他的最新版本。

我以前做过这样的工作,需要清理、删除和附加大型邮件列表。你总是受到 IO 限制。尝试固态驱动器,尤其是英特尔的“E”系列,它具有非常快的写入性能,并尽可能并行地对它们进行 RAID。我们还使用了网格,但必须调整算法以执行会减少数据的多通道方法。

请注意,如果数据非常规则,我会同意其他强调加载到数据库和索引的答案。在这种情况下,您基本上是在做 ETL,这是仓库社区中一个众所周知的问题。但是,如果数据是临时数据,那么您的科学家只是将他们的结果放在一个目录中,您需要“敏捷/及时”转换,如果大多数转换是单通道选择...哪里...加入,那么你正在以正确的方式接近它。

于 2010-07-29T21:08:08.417 回答
1

如果我有名声,我会赞成 Jason 的建议。我唯一的补充是,如果您不以数据库 Jason 建议的不同格式存储它,而不是在最初处理它时只支付一次解析成本。

于 2010-07-29T21:47:27.430 回答
1

您可以使用VelocityDB做到这一点。将制表符分隔的数据读入 C# 对象和数据库的速度非常快。整个维基百科文本是一个 33GB 的 xml 文件。该文件需要 18 分钟才能读入并作为对象持久保存(每个 Wikipedia 主题 1 个)并存储在紧凑型数据库中。许多示例显示了如何在下载过程中读取制表符分隔的文本文件。

于 2012-02-12T06:53:54.447 回答
1

这个问题已经得到解答,我同意大部分陈述。

在我们的中心,我们有一个标准的谈话,“所以你有 40TB 的数据”,因为科学家们现在一直在这种情况下发现自己。该演讲名义上是关于可视化,但主要是关于为那些不熟悉它的人管理大量数据。我们试图理解的基本点:

  • 规划您的 I/O
    • 二进制文件
    • 尽可能大的文件
    • 可并行读取的文件格式,提取的子区域
    • 避免大量文件
    • 特别是避免单个目录中的数以万计的文件
  • 数据管理必须扩展:
    • 包括出处的元数据
      • 减少重做的需要
    • 合理的数据管理
      • 数据目录的层次结构只有在它总是有效的情况下
    • 数据库,允许元数据的格式
  • 使用可扩展、可自动化的工具:
    • 对于大型数据集,并行工具 - ParaView、VisIt 等
    • 可编写脚本的工具 - gnuplot、python、R、ParaView/Visit...
    • 脚本提供可重复性!

一般来说,我们在大规模 I/O方面有相当多的东西,因为这对科学家来说是一个越来越常见的绊脚石。

于 2012-02-12T15:18:47.840 回答