【问题标题】:python write output to different fifo pipe file?python将输出写入不同的fifo管道文件?
【发布时间】:2014-02-18 07:49:00
【问题描述】:

我正在尝试将一个非常大的文本文件分成两部分并将这两部分转储到两个不同的 mysql 表中。我在 python 中执行此操作,逐行检查文本并按类别代码对每一行进行分类。

现在,在我分割文本之后,如何将它们通过管道传输到两个单独的 fifo 文件中,以便将这些 fifo 传输到 mysql 客户端工具?

【问题讨论】:

  • 什么是管道文件?为什么不直接通过python访问mysql?
  • 插入每一行都太慢了,通过管道我可以使用mysql'load data',它比'insert'快
  • 你能再解释一下你说的“管道文件”是什么意思吗?
  • 对不起,我的意思是使用先进先出。我正在使用一个名为 pt-fifo-split 的 percona 工具,它可以从 fifo 文件中读取。

标签: python mysql pipe fifo


【解决方案1】:

我假设你想要做的是调用 MYSQL 命令

LOAD DATA INFILE

没有实际创建 INFILE。您可以尝试使用mysqlimport 命令行客户端,如果它愿意接受管道,请执行以下操作:

python categorize.py --code x big_text_file.txt | mysqlimport db_name /dev/stdin

您的 Python 脚本通过命令行上的代码输入拆分文本文件,并将结果作为字符串输出,然后通过管道传输到 mysqlimport。

【讨论】:

  • 但他显然想创建两个独立的管道,而不仅仅是一个,所以这行不通。
【解决方案2】:

我认为您希望从同一个 Python 脚本为两个独立且显然是同时的 MySQL 导入创建管道?

虽然不可能通过 shell 重定向来做到这一点,但它会很痛苦。您的 Python 脚本必须以某种方式将其管道的文件描述符传递给 shell,因此您的 shell 脚本可以将这些文件描述符重定向到 MySQL 命令。

一个更简单的解决方案是在 Python 中使用 subprocess 模块。

我不知道您希望用于批量加载的工具和语法;你告诉我们的只是你想给它一个“管道”。因此,我将假设它是 hbristow 的答案中提到的 mysqlimport 命令,并且它通过通常的 Unix 约定处理标准输入,将其提供为 - 作为文件名;因为这只是为了展示真正有趣的部分,所以无论如何都不是很重要。

所以:

from subprocess import Popen, stdin

args = ['mysqlimport', my_db_name, '-']
with Popen(args, stdin=PIPE) as import1, Popen(args, stdin=PIPE) as import2:
    with open('giantfile.txt') as f:
        for line in f:
            data = parse(line)
            if belongs_in_import2(data):
                import2.stdin.write(make_sql(data))
            else:
                import1.stdin.write(make_sql(data))

我们创建了两个独立的子进程,每个子进程都有自己独立的stdin 管道,我们可以像写入任何其他文件一样向它们写入数据。

如果mysqlimport 工具希望您在实际等待输入文件退出之前关闭/EOF,您可能需要import1.stdin.close()import2.stdin.close()

如果您使用的是 Python 2.4-2.7,则应安装并使用 subprocess32 反向端口。如果由于某种原因不能这样做(或者如果您使用 Python 3.0-3.1 并且由于某种原因无法升级),则不能在此处使用 with 语句;相反,您需要显式地 close 管道和 wait 进程。

【讨论】:

  • 这很好,至少它向我展示了分离的进程,那么make_sql函数是做什么的呢?这个函数返回什么?
  • @Suanmeiguo:它做任何你想做的事。大概您正在尝试为每一行输入数据生成一行数据或一条语句作为输出以传递给 MySQL 批量加载器。该函数是您放置生成该输出并将其作为字符串(包括尾随换行符)返回的代码的位置。
猜你喜欢
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
相关资源
最近更新 更多