“fasta 文件中序列的平均长度”:你能改进这个 Erlang 代码吗?

2024-02-18

我正在尝试获取平均长度快速序列 http://en.wikipedia.org/wiki/Fasta_Sequence using Erlang。 fasta 文件看起来像这样

>title1
ATGACTAGCTAGCAGCGATCGACCGTCGTACGC
ATCGATCGCATCGATGCTACGATCGATCATATA
ATGACTAGCTAGCAGCGATCGACCGTCGTACGC
ATCGATCGCATCGATGCTACGATCTCGTACGC
>title2
ATCGATCGCATCGATGCTACGATCTCGTACGC
ATGACTAGCTAGCAGCGATCGACCGTCGTACGC
ATCGATCGCATCGATGCTACGATCGATCATATA
ATGACTAGCTAGCAGCGATCGACCGTCGTACGC
>title3
ATCGATCGCATCGAT(...)

我尝试使用以下内容来回答这个问题Erlang code:

-module(golf).
-export([test/0]).

line([],{Sequences,Total}) ->  {Sequences,Total};
line(">" ++ Rest,{Sequences,Total}) -> {Sequences+1,Total};
line(L,{Sequences,Total}) -> {Sequences,Total+string:len(string:strip(L))}.

scanLines(S,Sequences,Total)->
        case io:get_line(S,'') of
            eof -> {Sequences,Total};
            {error,_} ->{Sequences,Total};
            Line -> {S2,T2}=line(Line,{Sequences,Total}), scanLines(S,S2,T2)
        end  .

test()->
    {Sequences,Total}=scanLines(standard_io,0,0),
    io:format("~p\n",[Total/(1.0*Sequences)]),
    halt().

编译/执行:

erlc golf.erl
erl -noshell -s golf test < sequence.fasta
563.16

这段代码对于一个小的 fasta 文件似乎工作得很好,但是解析一个更大的文件(>100Mo)需要几个小时。为什么 ?我是 Erlang 新手,你能改进这段代码吗?


如果你需要非常快的 IO,那么你必须比平常做更多的技巧。

-module(g).
-export([s/0]).
s()->
  P = open_port({fd, 0, 1}, [in, binary, {line, 256}]),
  r(P, 0, 0),
  halt().
r(P, C, L) ->
  receive
    {P, {data, {eol, <<$>:8, _/binary>>}}} ->
      r(P, C+1, L);
    {P, {data, {eol, Line}}} ->
      r(P, C, L + size(Line));
    {'EXIT', P, normal} ->
      io:format("~p~n",[L/C])
  end.

据我所知,这是最快的 IO,但请注意-noshell -noinput。 编译就像erlc +native +"{hipe, [o3]}" g.erl但与-smp disable

erl -smp disable -noinput -mode minimal -boot start_clean -s erl_compile compile_cmdline @cwd /home/hynek/Download @option native @option '{hipe, [o3]}' @files g.erl

and run:

time erl -smp disable -noshell -mode minimal -boot start_clean -noinput -s g s < uniprot_sprot.fasta
352.6697028442464

real    0m3.241s
user    0m3.060s
sys     0m0.124s

With -smp enable但本机需要:

$ erlc +native +"{hipe, [o3]}" g.erl
$ time erl -noshell -mode minimal -boot start_clean -noinput -s g s<uniprot_sprot.fasta
352.6697028442464

real    0m5.103s
user    0m4.944s
sys     0m0.112s

字节码但与-smp disable(几乎与本地相同,因为大部分工作都是在端口中完成的!):

$ erlc g.erl
$ time erl -smp disable -noshell -mode minimal -boot start_clean -noinput -s g s<uniprot_sprot.fasta
352.6697028442464

real    0m3.565s
user    0m3.436s
sys     0m0.104s

只是为了 smp 字节码的完整性:

$ time erl -noshell -mode minimal -boot start_clean -noinput -s g s<uniprot_sprot.fasta 
352.6697028442464

real    0m5.433s
user    0m5.236s
sys     0m0.128s

用于比较sarnold https://stackoverflow.com/users/377270/sarnold version https://stackoverflow.com/questions/3296855/average-length-of-the-sequences-in-a-fasta-file-can-you-improve-this-erlang-co/3296952#3296952给了我错误的答案,并且在相同的硬件上需要更多:

$ erl -smp disable -noinput -mode minimal -boot start_clean -s erl_compile compile_cmdline @cwd /home/hynek/Download @option native @option '{hipe, [o3]}' @files golf.erl
./golf.erl:5: Warning: variable 'Rest' is unused
$ time erl -smp disable -noshell -mode minimal -s golf test
359.04679841439776

real    0m17.569s
user    0m16.749s
sys     0m0.664s

EDIT: 我看过的特点uniprot_sprot.fasta我有点惊讶。它有 3824397 行和 232MB。代表着-smp disabled版本可以每秒处理 118 万行文本(面向行 IO 为 71MB/s)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“fasta 文件中序列的平均长度”:你能改进这个 Erlang 代码吗? 的相关文章

  • 字符串文字的行为令人困惑

    下面的代码中字符串文字的行为非常令人困惑 我可以理解第 1 行 第 2 行和第 3 行是true 但为什么是第 4 行false 当我打印两者的哈希码时 它们是相同的 class Hello public static void main
  • Java 压缩字符串

    我需要创建一个接收字符串并返回字符串的方法 防爆输入 AAABBBCCC 防爆输出 3A4B2C 好吧 这很尴尬 我在今天的面试中无法做到这一点 我正在申请初级职位 现在 我在家尝试制作一些静态工作的东西 我的意思是 不使用循环有点无用 但
  • 无法解析 Android 资源字符串

    我正在学习 Android 我遇到了一个我认为很奇怪的问题 在 res values strings xml 我有
  • Java 相当于 C# 中带有 @ 的逐字字符串

    快问 Java 中是否存在应用于字符串的 等效项 例如我可以做 c afolder afile 在 C 中 让它在处理时忽略转义字符 而不必这样做 c afolder aFile Java 有等效的吗 嗯 stackoverflow 正在逃
  • DASM 汇编器中的 ASCII 到 C64 屏幕代码

    我正在通过 C64 模拟器学习 6502 micro 的汇编 目前正在尝试将字符串输出到屏幕 这是我的代码 processor 6502 org 1000 ldx 00 using x register as column counter
  • 在 C# 中将字符串转换为类型[重复]

    这个问题在这里已经有答案了 如果我收到一个包含类名称的字符串 并且我想将该字符串转换为真实类型 字符串中的类型 我该怎么做 I tried Type GetType System Int32 例如 它似乎有效 但是当我尝试使用自己的对象时
  • python 拆分而不创建空白

    我明白为什么使用 split 创建空白很重要 这要归功于这个问题 https stackoverflow com questions 2197451 why are empty strings returned in split resul
  • 创建 JSON 对象并将其转换为 Java 中的 String

    我需要通过 http post 发送一个相当长的 JSON 标头 在Python中是这样的 self body header client self client name clientRevision self client versio
  • 字符串中的换行符未写入文件

    我正在尝试编写一个程序来操作从文件中读取的 unicode 字符串 我想到了两种方法 一种方法是读取包含换行符的整个文件 执行几个正则表达式替换 然后将其写回另一个文件 另一种方法是读取包含换行符的整个文件 执行几个正则表达式替换 然后将其
  • 使用迭代器将部分文件流读入字符串

    这是我到目前为止所尝试过的但没有成功 std string ReadPartial std ifstream file int size std istreambuf iterator
  • Python - 如何将双引号附加到字符串并存储为新字符串?

    我正在使用 Python 2 6 并且想将双引号附加到字符串并将其存储为新的字符串变量 我不想打印它 但稍后在我的 python 脚本中使用它 例如 a apple b some function a gt b would be equal
  • 返回空字符串:C++ 中的有效方法

    我有两种从函数返回空字符串的方法 1 std string get string return 2 std string get string return std string 哪一种更有效 为什么 Gcc 7 1 O3 这些都是相同的
  • 点分隔的字符串资源名称有什么用?

    我使用 Snake style 来命名字符串资源 在某人的代码中 我发现了另一种带有点的符号 我无法找到关于这个主题的任何单词
  • 如何获取字符串的前五个字符

    我读过这个获取第一个字符的问题 https stackoverflow com q 3878820 1716774字符串的 有没有办法从 C 中的字符串中获取前 n 个字符 您可以使用可枚举 Take http msdn microsoft
  • 如何从路径和文件名中删除非法字符?

    我需要一种强大且简单的方法来从简单字符串中删除非法路径和文件字符 我使用了下面的代码 但它似乎没有做任何事情 我错过了什么 using System using System IO namespace ConsoleApplication1
  • 从文件中读取单词并放入列表中

    本质上 我有一个巨大的文件 所有文件包含每行多个单词 每个单词用空格分隔 有点像这样 WORD WORD WORD WORD ANOTHER WORD SCRABBLE BLAH YES NO 我想要做的是将文件中的所有单词放入一个巨大的列
  • 在 JavaScript 中给变量字符串加上引号

    我有一个 JavaScript 变量 var text http example com 文本可以是多个链接 如何在变量字符串周围放置 例如 我希望字符串看起来像这样 http example com var text http examp
  • 以 ASCII 字符串形式获取 MemoryStream 内容的快速方法

    我在 MemoryStream 中有一个 JSON 字符串 我使用以下代码将其作为 ASCII 字符串获取 MemoryStream memstream new MemoryStream Write a JSON string to mem
  • 用于检索编辑距离接近的字符串的数据结构

    例如 从一组英语单词开始 是否有一种结构 算法允许使用单词 right 作为查询来快速检索诸如 light 和 tight 之类的字符串 即 我想检索与查询字符串编辑距离较小的字符串 The BK tree http blog notdot
  • 如何使用正则表达式提取子字符串

    我有一个字符串 其中有两个单引号 特点 单引号之间是我想要的数据 如何编写正则表达式从以下文本中提取 我想要的数据 mydata some string with the data i want inside 假设您想要单引号之间的部分 请

随机推荐

  • Google 是否/将会在 Firebase 崩溃报告中支持 NDK C++ 崩溃?

    我试图从文档中找出Google是否支持新发布的NDK C 崩溃Firebase 崩溃报告 https firebase google com docs crash 到目前为止 我只看到了 Java 崩溃支持 有谁知道 Google 是否计划
  • 列表的编辑器模板

    我希望为我的 ASP NET MVC3 站点中的一些基本模型创建一个通用编辑器 现在它们可以包含字符串 布尔值 枚举和列表集合 我想要做的是扩展默认编辑器模板以识别列表并显示一个自定义编辑器 该编辑器可以向该列表添加和删除字符串 其他所有的
  • 没有某些字段的深度克隆

    让我有下一个 javascript 对象 现在我想克隆它但没有一些字段 例如我想要没有字段的克隆对象 lastName and cars age Input firstName Fred lastName McDonald cars typ
  • Xcode 9 GM 种子模拟器屏幕工件

    我遇到了模拟器屏幕问题 安装了最后一个测试版后 当我构建任何项目时 它会随机发生 通常在我点击播放时发生 3 4 次 必须退出模拟器应用程序 然后重新启动它 有人有同样的问题吗 Screenshot Metal 似乎是新模拟器的默认渲染器
  • 骨干监听模型中对象的变化

    我可以监听模型中某个对象的任何变化吗 我知道如何监听模型更改 但我只需要监听模型和视图中的对象 var view Backbone View extend func initialize function this listenTo thi
  • redis数据库中HSET和HMSET方法有什么区别

    在我的应用程序中 我使用 redis 数据库 我已经阅读了他们的文档 但我找不到 HSET 和 HMSET 之间的区别 HSET 过去只能设置一个键值对 如果您需要一次设置多个 则必须使用 HMSET M 表示多个 几年前这一情况发生了变化
  • 如何在 VBScript 中将二进制数据写入磁盘?

    我有一个二进制字符串需要写入文件 我有一种感觉 这should是一个简单的程序 但话又说回来 VBScript 这FileSystemObject没有任何帮助 因为它会破坏数据 这Stream该物体看起来很有前途 它的adBinaryMod
  • 与 django 查询集注释中先前对象的差异

    假设我有以下模型 class TestModel models Model some integer models IntegerField 我有这个模型的 3 个实例 TestModel objects create some integ
  • 如何根据光标悬停移动背景?

    当光标悬停在滑块上时 背景也会随着光标悬停而移动 下面的链接 这是使用此效果的网站链接 泰勒马鲁克 http www telemaruk com 这种效应叫什么 以及如何达到这个效果 任何有用的链接请 它是某种 jquery 插件或简单的
  • 在 Kubernetes 上创建 mysql 容器时如何初始化?

    我想在容器的MySQL上设置初始数据 在 docker compose yml 中 此类代码可以在运行容器时创建初始数据 volumes db var lib mysql docker mysql conf d etc mysql conf
  • 列出可用的网络打印机(也未安装)[重复]

    这个问题在这里已经有答案了 这意味着我可以枚举所有打印机 网络和本地 但前提是它们安装在我的电脑上 但是 我希望能够列出那些未安装的并且可以通过使用 Windows 内置 添加打印机 对话框查看的打印机 这是否可能 因为我在浏览各种论坛 板
  • Spring Data JPA - 多个 EnableJpaRepositories

    我的应用程序有多个数据源 因此我基于此创建了两个数据源配置类URL https github com spring projects spring data examples tree master jpa multiple datasou
  • ZipFile 关闭后 ZipEntry 是否仍然存在?

    目前 我的库中存在看似合理的资源泄漏 因为我将 ZipFile 保持打开状态 因此某个 ZipEntry 返回的 InputStream 未关闭 但是 关闭返回的 InputStream 并不会关闭 ZipFile 的其余部分 因此我坚持将
  • 判断两个Git分支是否有分歧

    我想确定两个 Git 分支是否有分歧 或者其中一个分支是否可以简单地快速转发到另一个分支 换句话说 我想检查其中一个分支的当前 HEAD 是否已在某个时刻合并到另一个分支中 或者它是否包含不在另一个分支中的提交 有没有办法在不实际合并两个分
  • 带 VideoView 的无缝视频循环

    我有以下代码将视频作为原始资源 启动视频并循环播放 但我需要视频在剪辑结束时无缝循环 并再次启动剪辑 之间的转换会导致闪烁一瞬间 我的应用程序确实无法做到这一点 public class Example extends Activity V
  • 获取所有大于某个值的 stl 向量元素

    我想知道如何找到具有验证特定条件的值的 stl 向量元素列表 例如 如果我有一个 int 值向量 vector
  • 从Linux调用Windows批处理文件

    我有一个仅在 Windows 上运行的应用程序和一个启动它的批处理文件 我想从 Linux 调用这个批处理文件 这意味着 Linux 批处理之类的东西将使用参数启动 Windows 批处理 然后依次运行我的应用程序 我可以这样做吗 如何 你
  • 在套接字编程c#中发送大文件[重复]

    这个问题在这里已经有答案了 我想用 c 中的套接字发送大文件 文件可以传输 但当我想打开它时 我看到它已损坏 有什么问题 我在客户端代码中将文件分成 2KB 的数组并发送 然后 在服务器代码中 我收到它并将其放入字节数组中并转换为文件 服务
  • Word VSTO - 为什么有时会丢失 paraId

    我正在从 openXML 检索段落样式名称并使用 paraID 属性来获取正确的样式名称 在测试过程中 我注意到根据单词文档 该属性可能不会出现在任何段落中 我确实知道这是 Word 的内部运行时段落 ID 所以问题是 是什么在段落上生成
  • “fasta 文件中序列的平均长度”:你能改进这个 Erlang 代码吗?

    我正在尝试获取平均长度快速序列 http en wikipedia org wiki Fasta Sequence using Erlang fasta 文件看起来像这样 gt title1 ATGACTAGCTAGCAGCGATCGACC