我在生物实验室工作,我必须设计一个数据库来存储许多 DNA 微阵列实验结果。
每个实验都由许多微阵列(平均约十个)组成,每个微阵列包含超过 500 万个探针。每个探针都映射到一个特定的基因 id,当然在所有实验中相同的探针匹配相同的 gene_id。目的是存储每个微阵列的强度值,以便能够在特定实验中快速检索特定基因id的探针的强度值。
事实上,一个简单的 mysql 表就足够了,它看起来像这样:
强度表: |probe_id|experiment_id|microarray_id|gene_id|intensity_value
主键由(probe_id, experiment_id, microarray_id, gene_id)组成
这是问题所在:每个实验都有许多微阵列,其中有超过 500 万个探针。通过 1000 次实验,平均 10 个微阵列(这是一个低估计,有些有数百个),它的 1000 * 10 * 5M = 500 亿行。估计会很慢而且我完全不知道如何处理数十亿行的 mysql 表。那可能吗 ?有什么建议吗?
我也对 noSQL 数据库很好奇。我从未使用过 cassandra,但在我看来它非常适合这项任务,对吗?我可以想象这样一个 shema :
{
experiment_id_1:{ <- thats a super collumnFamilly ?
gene_id_1:{ <- thats a collumnFamilly ?
probe_id_1:{ value_microarray_1, value_microarray_2, ... }, <- thats a superCollumn ?
probe_id_2:{ value_microarray_1, value_microarray_2, ... },
probe_id_3:{ value_microarray_1, value_microarray_2, ... },
...
},
gene_id_2:{
probe_id_1:{ value_microarray_1, value_microarray_2, ... },
probe_id_2:{ value_microarray_1, value_microarray_2, ... },
probe_id_3:{ value_microarray_1, value_microarray_2, ... },
...
}
}
experiment_id_2{
...
}
...
}
我说得对吗?它适合 Cassandra 模型吗?会有效率吗?你怎么看 noSQL 专家 :)
谢谢。
最佳答案
在这种方法中,我还会考虑基于 NoSQL 数据库的关系。如果您做出一些考虑,您将能够检查您是否能够处理数据:
如果我必须处理这种情况,我通常会生成一些与我希望在我的表中具有的数据相似的测试数据,并使用不同的服务器参数进行测试。我也考虑使用 partitioning of tables在这种情况下(例如对 experiment_id 进行分区。这将导致表拆分为更小的子集,这可以通过现有的硬件边界来处理。你不敢自己做这个,MySQL 可以为你做这个并且该表将作为单个表呈现给用户。但是机器只需要处理存储给定 experiment_id 的数据集的部分。这会导致更快的 I/O 等。
我已经看到机器可以轻松处理比您预期的行数多得多的表,但是您必须仔细规划此类设置,并且通常需要大量测试/优化/重新设计才能将其投入生产.但付出这种努力总是值得的,因为这是一件非常有趣的事情。
(我在学习期间处理 embl 数据时第一次接触了这个领域,这成为了我的热情;))
关于mysql - 数十亿行 mysql 表/cassandra 模型-(以及一些生物学知识 :)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10028061/
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐
我想找到在某些文本中找到一些(让它是两个)句子的好方法。什么会更好-使用正则表达式或拆分方法?你的想法?应JeremyStein的要求-有一些例子示例:输入:ThefirstthingtodoistocreatetheCommentmodel.We’llcreatethisinthenormalway,butwithonesmalldifference.IfwewerejustcreatingcommentsforanArticlewe’dhaveanintegerfieldcalledarticle_idinthemodeltostoretheforeignkey,butinthis
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi
我的ruby脚本从命令行参数获取某些输入。它检查是否缺少任何命令行参数,然后提示用户输入。但是我无法使用gets从用户那里获得输入。示例代码:test.rbname=""ARGV.eachdo|a|ifa.include?('-n')name=aputs"Argument:#{a}"endendifname==""puts"entername:"name=getsputsnameend运行脚本:rubytest.rbraghav-k错误结果:test.rb:6:in`gets':Nosuchfileordirectory-raghav-k(Errno::ENOENT)fromtes
我正在使用ruby1.8.7。p=lambda{return10;}deflab(block)puts'before'putsblock.callputs'after'endlabp以上代码输出为before10after我将相同的代码重构到这里deflab(&block)puts'before'putsblock.callputs'after'endlab{return10;}现在我收到LocalJumpError:意外返回。对我来说,这两个代码都在做同样的事情。是的,在第一种情况下我传递了一个过程,在第二种情况下我传递了一个block。但是&block将该block转换为pro