使用Django python脚本从文本文件中添加数据加速postgresql

时间:2013-06-20 10:38:18

标签: shell parallel-processing postgresql-9.1 parallel-python ipython-parallel

我正在使用服务器,其配置如下:

RAM - 56GB 处理器 - 2.6 GHz x 16核 如何使用shell进行并行处理?如何利用处理器的所有内核?

我必须从包含数百万条目的文本文件加载数据,例如一个文件包含50万行数据。 我使用django python脚本在postgresql数据库中加载数据。 但是,即使我有这么好的配置,在数据库中添加数据也需要很多时间。服务器,但我不知道如何并行使用服务器资源,以便处理数据所需的时间更少。 昨天我只从文本文件到postgresql加载了15000行数据,花了近12个小时来完成它。 我的django python脚本如下:

import re
import collections
    def SystemType():
        filename = raw_input("Enter file Name:")
        in_file = file(filename,"r")
        out_file = file("SystemType.txt","w+")
        for line in in_file:
            line = line.decode("unicode_escape")
            line = line.encode("ascii","ignore")
            values = line.split("\t")
            if values[1]:
                for list in values[1].strip("wordnetyagowikicategory"):
                        out_file.write(re.sub("[^\ a-zA-Z()<>\n""]"," ",list))

    # Eliminate Duplicate Entries from extracted data using regular expression

def FSystemType():
    lines_seen = set()
    outfile = open("Output.txt","w+")
    infile = open("SystemType.txt","r+")
    for line in infile:
        if line not in lines_seen:
                l = line.lstrip()
# Below reg exp is used to handle Camel Case.
                outfile.write(re.sub(r'((?<=[a-z])[A-Z]|(?<!\A)[A-Z](?=[a-z]))', r' \1', l).lower())
                lines_seen.add(line)
    infile.close()
    outfile.close()




 sylist=[]
        def create_system_type(stname):
            syslist=Systemtype.objects.all()
            for i in syslist:
                sylist.append(str(i.title))
            if not stname in sylist:
                slu=slugify(stname)
                st=Systemtype()
                st.title=stname
                st.slug=slu
        #   st.sites=Site.objects.all()[0]
                st.save()
            print "one ST added."

2 个答案:

答案 0 :(得分:0)

如果你可以在没有代码的情况下表达你的要求(不是每个shell程序员都能真正阅读phython),我们可以在这里提供帮助。

e.g。您的15000行12小时的报告表明您在某处有一个太忙的“for”循环,我建议嵌套

for list in values[1]....
你试图剥夺什么?个性,整言? ...

然后我建议“awk”。

答案 1 :(得分:0)

如果能够计算出Django所需的精确数据结构,则可以使用psql "copy"命令直接加载数据库表。您可以通过准备加载到db中的csv文件来完成此操作。

使用您的方法加载速度慢的原因有很多。首先,Django有很多事务开销。其次,您不清楚运行Django代码的方式是什么 - 这是通过内部测试服务器吗?如果是这样,你可能不得不处理它的缓慢。最后,什么使得快速数据库通常与CPU无关,而是快速IO和大量内存。