如何在Spark(Python/Scala)中处理ASM文件

2024-09-27 07:23:58 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,下面是来自ASM文件的示例行,其中包含类似以下内容的100-200万行:

.text:0040120F 03 CA                                   add     ecx, edx
.text:00401211 89 48 3C                                mov     [eax+3Ch], ecx
.text:00401214 8B 0D C4 7E 58 00                           mov     ecx, dword_587EC4

我想计算Spark中每个文件的头(文本)和段(add,mov),以便快速处理。我读过文档/文章,但没有找到任何技术来逐行分析文件,只计算这些头文件段。在

处理后,结果应为:

^{pr2}$

有没有办法只从Spark的装配文件中提取这些零件?


Tags: 文件text文档文本add示例edxspark
1条回答
网友
1楼 · 发布于 2024-09-27 07:23:58

问题大小

假设程序集文件的每一行占用200字节的数据。 一个50MB的文件大约有250000行,用5.6分钟来处理它们,每行的处理时间是1到1.5毫秒。这是相当高的,但让我们保持它不受挑战。按照这个速度,处理136GB需要10天半的时间。在

使用Spark映射/减少

在这些假设下,map reduce似乎确实很受欢迎,希望Spark能有所帮助。我不知道您在使用哪个基础结构来运行Spark作业,所以下面的重点是处理ASM文件行的代码,并且仍然非常通用。在

首先,让我们实现从每一行单独提取信息的逻辑。在

val regex = "\\.(.*):(?:[A-Z0-9]+\\s)+\\s+([a-z]+).*".r

def parse(line: String) = {
  line match {
    case regex(header, instruction) => Seq(header, instruction)
    case _ => Seq()
  }
}

现在我们需要从程序集文件创建一个RDD

^{pr2}$

或者如果要从目录中读取所有文件:

val rdd = sparkContext.textFile("hdfs://path/*")

并编写实际的map/reduce来提取行标题和ASM指令的频率:

^{4}$

测试和结果

我在一个spark-shell中用您的示例中的三行代码测试了它:

val rdd = sc.parallelize(Seq(
  ".text:0040120F 03 CA                    add     ecx, edx",
  ".text:00401211 89 48 3C                 mov     [eax+3Ch], ecx",
  ".text:00401214 8B 0D C4 7E 58 00        mov     ecx, dword_587EC4"
))

并显示输出:

frequencies.foreach(x => println(x._1 + ":" + x._2))

这个给了

mov:2
add:1
text:3

注意事项

特别的“解析”逻辑是基于我对问题陈述的理解,但是我想它需要根据您的用例进行调整。在

相关问题 更多 >

    热门问题