我正计划将来自质谱仪的扫描结果存储在MySQL数据库中,并想知道是否可以远程存储和分析这一数量的数据。我知道性能会因环境而异,但是我正在寻找一个大致的数量级:查询需要5天还是5毫秒?
输入格式
每个输入文件都包含一个光谱仪。每次运行都由一组扫描组成,并且每次扫描都有一个有序的数据点数组。有一些元数据,但是文件的大部分由32位或64位int或float数组组成。
主机系统
| ---------------- + ------------------------------- | | 操作系统| Windows 2008 64位| | MySQL版本| 5.5.24(x86_64)| | CPU | 2个Xeon E5420(共8核)| | 内存 8GB | | SSD文件系统| 500 GiB | | 硬盘RAID | 12 TiB | | ---------------- + ------------------------------- |
使用可忽略的处理器时间在服务器上运行其他一些服务。
文件统计
| ------------------ + -------------- | | 文件数| 〜16,000 | | 总尺寸| 1.3钛| | 最小尺寸| 0字节| | 最大尺寸| 12 GiB | | 意思 800 MiB | | 中位数 500 MiB | | 总数据点| 约2000亿| | ------------------ + -------------- |
数据点的总数是非常粗略的估计。
拟议方案
我打算做“正确的”事情(例如,疯狂地规范化数据),因此将有一个runs
表,一个spectra
带有外键runs
的datapoints
表和一个带有外键的表spectra
。
2000亿数据点问题
我将跨多个光谱甚至可能多次运行进行分析,导致查询可能涉及数百万行。假设我对所有内容进行了正确索引(这是另一个问题的主题),并且没有试图在网络上随机播放数百个MiB,那么MySQL处理此问题在远程看来是否合理?
附加信息
扫描数据将来自基于XML的
mzML格式的文件。这种格式的<binaryDataArrayList>
内容在存储数据的
元素中。每次扫描都会产生> = 2个<binaryDataArray>
元素,这些元素加在一起形成形式为的二维(或更多)数组[[123.456, 234.567, ...], ...]
。
这些数据是一次写入的,因此不必担心更新性能和事务安全性。
我对数据库架构的简单计划是:
runs
表
| 列名| 类型 | ------------- + ------------- || | id | 主键| | start_time | 时间戳| | 名称| VARCHAR | | ------------- + ------------- ||
spectra
表
| 列名| 类型 | ---------------- + ------------- | | id | 主键| | 名称| VARCHAR | | 索引| INT | | spectrum_type | INT | | 代表性| INT | | run_id | 外键| | ---------------- + ------------- |
datapoints
表
| 列名| 类型 | ------------- + ------------- || | id | 主键| | spectrum_id | 外键| | mz | 双| | num_counts | 双| | 索引| INT | | ------------- + ------------- ||
这合理吗?
因此,您可能已经推断出,我是程序员,而不是实验室的生物学家,所以我对科学的了解不及实际科学家。
这是我将要处理的数据类型的单个频谱图(扫描图):
该软件的目的是弄清楚峰的位置和重要性。我们现在使用专有的软件包来解决这个问题,但是我们想编写自己的分析程序(用R语言编写),因此我们知道表中到底发生了什么。如您所见,绝大多数数据都不有趣,但是我们不想丢掉算法遗漏的潜在有用数据。一旦获得了我们满意的可能峰列表,其余管道将使用该峰列表,而不是数据点的原始列表。我认为将原始数据点存储为一个大斑点就足够了,因此可以根据需要对其进行重新分析,但仅将峰保留为不同的数据库条目。在那种情况下,每个频谱只有几个峰值,所以疯狂的缩放比例不应该