读取并绘制从大文件中读取的数据

2024-05-13

我们有相当大的文件,大约为 1-1.5 GB(主要是日志文件),其中包含易于解析为 csv 的原始数据,随后应该将其绘制成图表以生成一组图形图像。

目前,我们正在使用 bash 脚本将原始数据转换为 csv 文件,其中仅包含需要绘制图表的数字,然后将其输入到 gnuplot 脚本中。但这个过程极其缓慢。我尝试通过替换一些管道来加速 bash 脚本cuts, trs等与一个单一的awk命令,虽然这样提高了速度,但是整个事情还是很慢。

所以,我开始相信这个过程有更好的工具。我目前正在考虑用 python+numpy 或 R 重写这个过程。我的一个朋友建议使用 JVM,如果我要这样做,我将使用 clojure,但我不确定 JVM 将如何执行。

我在处理此类问题方面没有太多经验,因此任何有关如何进行的建议都会很好。谢谢。

Edit:另外,我想存储(到磁盘)生成的中间数据,即 csv,所以我不必重新生成它,如果我选择我想要一个不同的图形。

Edit 2:原始数据文件每行一条记录,各字段之间用分隔符 (|)。并非所有字段都是数字。我在输出 csv 中需要的每个字段都是通过对输入记录应用特定公式获得的,该公式可能使用输入数据中的多个字段。输出 csv 每行有 3-4 个字段,我需要在(可能是)条形图中绘制 1-2、1-3、1-4 个字段的图表。我希望这能提供更好的图片。

Edit 3:我对@adirau 的脚本做了一些修改,看起来效果很好。我已经走得足够远了,我正在读取数据,发送到处理器线程池(伪处理,将线程名称附加到数据),然后通过另一个将其聚合到输出文件中集电极 thread.

PS:我不太清楚这个问题的标签,欢迎指正。


python 听起来是一个不错的选择,因为它有一个很好的线程 API(尽管实现有问题)、matplotlib 和 pylab。我错过了您的更多规格,但这也许对您来说是一个很好的起点:matplotlib:使用线程异步绘图 https://www.esclab.tw/wiki/index.php/Matplotlib#Asynchronous_plotting_with_threads。 我会选择一个线程来处理批量磁盘 I/O 读取,并将队列同步到线程池进行数据处理(如果您有固定的记录长度,通过预先计算读取偏移量并将偏移量传递到线程池,事情可能会变得更快) ;使用diskio线程,我将映射数据源文件,读取预定义的num字节+再读取一次,以最终获取当前数据源行输入末尾的最后一个字节;应选择接近平均行输入长度的 numbytes;接下来是通过队列进行池馈送以及在线程池中进行的数据处理/绘图;我这里没有很好的图片(您到底在绘制什么),但我希望这会有所帮助。

编辑:有 file.readlines([sizehint]) 可以一次抓取多行;好吧,它可能不会那么快,因为文档说它在内部使用 readline()

编辑:快速骨架代码

import threading
from collections import deque
import sys
import mmap


class processor(Thread):
    """
        processor gets a batch of data at time from the diskio thread
    """
    def __init__(self,q):
        Thread.__init__(self,name="plotter")
        self._queue = q
    def run(self):
        #get batched data 
        while True:
            #we wait for a batch
            dataloop = self.feed(self._queue.get())
            try:
                while True:
                    self.plot(dataloop.next())
            except StopIteration:
                pass
            #sanitizer exceptions following, maybe

    def parseline(self,line):
        """ return a data struct ready for plotting """
        raise NotImplementedError

    def feed(self,databuf):
        #we yield one-at-time datastruct ready-to-go for plotting
        for line in databuf:
            yield self.parseline(line)

    def plot(self,data):
        """integrate
        https://www.esclab.tw/wiki/index.php/Matplotlib#Asynchronous_plotting_with_threads
        maybe
        """
class sharedq(object):
    """i dont recall where i got this implementation from 
    you may write a better one"""
    def __init__(self,maxsize=8192):
        self.queue = deque()
        self.barrier = threading.RLock()
        self.read_c = threading.Condition(self.barrier)
        self.write_c = threading.Condition(self.barrier)
        self.msz = maxsize
    def put(self,item):
        self.barrier.acquire()
        while len(self.queue) >= self.msz:
            self.write_c.wait()
        self.queue.append(item)
        self.read_c.notify()
        self.barrier.release()
    def get(self):
        self.barrier.acquire()
        while not self.queue:
            self.read_c.wait()
        item = self.queue.popleft()
        self.write_c.notify()
        self.barrier.release()
        return item



q = sharedq()
#sizehint for readine lines
numbytes=1024
for i in xrange(8):
    p = processor(q)
    p.start()
for fn in sys.argv[1:]
    with open(fn, "r+b") as f:
        #you may want a better sizehint here
        map = mmap.mmap(f.fileno(), 0)
        #insert a loop here, i forgot
        q.put(map.readlines(numbytes))

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

读取并绘制从大文件中读取的数据 的相关文章

  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • 条件字体颜色 R Markdown

    我无法找到一种方法来根据变量的值 gt 0 0 或 r setup include FALSE x lt 4 This is an R Markdown document r if x gt 0 textcolor red Markdown
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 无法在 Python 3 中导入 cProfile

    我试图将 cProfile 模块导入 Python 3 3 0 但出现以下错误 Traceback most recent call last File
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • 在 Shiny 中的用户会话之间共享反应数据集

    我有一个相当大的反应数据集 该数据集是通过轮询文件然后按预定义的时间间隔读取该文件而派生的 数据更新频繁 需要不断重新加载 诚然 重新加载可以增量完成并附加到 R 中的现有对象 但事实并非如此 然而目前 尽管会话中的数据相同 但此操作是针对
  • 线性判别分析图

    如何将样本 ID 行号 作为标签添加到此 LDA 图中的每个点 library MASS ldaobject lt lda Species data iris plot ldaobject panel function x y points
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐

  • 如何使用AWK脚本检查表的所有列数据类型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在这里 我正在检查表中第一列的数据类型 但我想知道AWK中表的所有列数据类型 我尝试过 但只能获得一列数据类型 例如 Column 1
  • Facebook API 错误 100 - 无效链接

    我正在使用 Facebook API 在我的 Rails 应用程序中创建发送对话框 我只是在 Javascript 中使用 Facebook 推荐的格式 作为 HTML 中的脚本 我的问题是我得到 API Error code 100 in
  • C# MonoGame 有帮助吗? (Content.Load("入侵者");)

    我正在 MonoGame 中使用 Open GL 制作太空入侵者游戏 并且尝试加载已添加到内容文件夹中的纹理 这是一个名为 Invader 的 PNG 文件 我使用的代码是 invader Content Load
  • 配置 KnpPaginator 以与 Twitter Bootstrap 配合使用

    i m trying to apply twitter bootstrap css style to my knp pagination without modifying the vendor Is there a way to conf
  • PHP MS Word 文件页数

    实际上我正在尝试计算 ms word 文件的页数 我正在使用这个 php 脚本 但是 没有向我显示确切的结果 并且脚本不是那么快 谁能帮助我获得更好的脚本 word new COM word application if word echo
  • Html5 全屏视频

    有什么办法可以做到这一点吗 我想全屏播放视频 没有浏览器 环境width 100 height 100 保持浏览器可见 不 目前还没有办法做到这一点 我希望他们在浏览器中添加这样的未来 EDIT 现在有一个全屏API http dvcs w
  • 将启用的计算机添加到 Active Directory OU

    我正在尝试以编程方式将计算机添加到我公司的 Active Directory 我在互联网上搜索了很长时间 但找不到解决方案 My code DirectoryEntry dirEntry new DirectoryEntry LDAP OU
  • 哪个更快:堆栈分配或堆分配

    这个问题听起来可能相当简单 但这是我与另一位合作的开发人员进行的辩论 我小心翼翼地在可能的地方进行堆栈分配 而不是堆分配它们 他一边跟我说话 一边看着我 并评论说没有必要 因为他们的表现是一样的 我总是有这样的印象 堆栈的增长是恒定的时间
  • 查找矩阵内的匹配子矩阵

    我有一个 100x200 2D 数组 表示为由黑色 0 和白色 255 单元组成的 numpy 数组 它是一个位图文件 然后我有 2D 形状 最容易将它们视为字母 它们也是 2D 黑白单元格 我知道我可以天真地迭代矩阵 但这将是我的代码的
  • 为什么 RDF 中对对象使用代码而不是字符串?

    例如 entity f06574 rdfs label Orioles 或者这样的格式 tt0268252 a Movie 在任一情况下 f06574 and tt0268252是代码 而不是实体或实例的实际字符串 原因之一可能是因为同一个
  • 用掩码替换字符串模式的最快方法

    我有类似的字符串 string string key foo bar 和参数数组 params array foo gt 1 bar gt 2 如何以 string 模式替换此参数 预期结果是 string key 1 2 首先 您需要重写
  • StackExchange.Redis的正确使用方法

    这个想法是使用更少的连接和更好的性能 连接会随时过期吗 对于另一个问题 redis GetDatabase 打开新连接 private static ConnectionMultiplexer redis private static ID
  • 通过 Google Play 服务撤销驱动器访问权限

    有没有办法撤销通过 Google Play 服务授予的驱动器访问权限 参考这篇文章 https developer android com google auth api client html https developer androi
  • Scala:如何将可变参数指定为类型?

    代替 def foo configuration String String 我希望能够写 type Configuration String String def foo configuration Configuration 主要用例是
  • Docker 中的 NGINX 缓存 IP 地址并提供错误的 Content-Type

    Summary 我想让NGINX 不是NGINX Plus 通过使用变量从DNS名称重新解析IP地址proxy pass 如建议的这篇 Nginx 官方文章 在变量中设置域名 部分 https www nginx com blog dns
  • Laravel 资源策略始终为 false

    我试图允许用户在 Laravel 5 4 中查看自己的个人资料 用户策略 php public function view User authUser user return true 在 AuthServiceProvider php 中
  • 如何使用 PKAddPassButton 创建“添加到苹果钱包”按钮以进行本地化通行证

    在我的 iOS 项目中 我有一个屏幕 允许用户创建苹果通行证并将其添加到钱包中 Apple 建议使用 PKAddPassButton 创建 添加到苹果钱包 按钮 当我尝试使用以下代码创建苹果通行证时 let passButton PKAdd
  • 有没有一个工具可以自动追踪未使用的代码

    我目前有 6 个不同的 Flex 应用程序 小部件 在主页上运行 它们都依赖于一个公共库项目 我目前正在非常大幅度地清理代码库 并且很难以这种方式保持概览 特别是因为我继承了代码库 有谁知道有一个工具可以自动通知我任何死代码 Cheers
  • ElementTree 和 Element 有什么区别? (Python XML)

    from xml etree ElementTree import ElementTree Element SubElement dump elem Element 1 sub SubElement elem 2 tree ElementT
  • 读取并绘制从大文件中读取的数据

    我们有相当大的文件 大约为 1 1 5 GB 主要是日志文件 其中包含易于解析为 csv 的原始数据 随后应该将其绘制成图表以生成一组图形图像 目前 我们正在使用 bash 脚本将原始数据转换为 csv 文件 其中仅包含需要绘制图表的数字