0

1GBを超えるテキストファイルを処理し、Pythonを使用してデータをMysqlデータベースに保存しようとしています。

以下にサンプルコードを貼り付けました

import os
import MySQLdb as mdb

conn = mdb.connect(user='root', passwd='redhat', db='Xml_Data', host='localhost', charset="utf8")

file_path = "/home/local/user/Main/Module-1.0.4/file_processing/part-00000.txt"

file_open = open('part-00000','r')

for line in file_open:
    result_words = line.split('\t')
    query = "insert into PerformaceReport (campaignID, keywordID, keyword, avgPosition)"
    query += " VALUES (%s,%s,'%s',%s) " % (result_words[0],result_words[1],result_words[2],result_words[3])
    cursor = conn.cursor()
    cursor.execute( query )
    conn.commit()

実際には、データが挿入されている列が18を超えていますが、貼り付けたのは4つだけです(たとえば)

したがって、上記のコードを実行すると、実行時間がいくらかかかりますhours

私の疑問はすべて

  1. Pythonで1GBのテキストファイルを非常に高速に処理する別の方法はありますか?
  2. 1GBのテキストファイルを処理し、データをデータベースに非常に高速に保存するフレームワークはありますか?
  3. 大きなサイズ(1GB)のテキストファイルを数分以内に処理し(可能ですか)、データをデータベースに保存するにはどうすればよいですか?私が懸念しているのは、1GBのファイルをできるだけ速く処理する必要があるが、数時間では処理しないことです。

編集されたコード

query += " VALUES (%s,%s,'%s',%s) " % (int(result_words[0] if result_words[0] != '' else ''),int(result_words[2] if result_words[2] != '' else ''),result_words[3] if result_words[3] != '' else '',result_words[4] if result_words[4] != '' else '')

実際、私は上記の形式で値を送信しています(結果の存在を確認することによって)

4

3 に答える 3

5

少し野蛮な推測ですがconn.commit()、ファイル内のすべての行が大きな違いを生むと思います。ループの外に移動してみてください。また、ループの各反復でカーソルを再作成する必要はありません。ループの前に1回だけ再作成してください。

于 2012-11-19T10:08:56.917 に答える
2

ティムが言ったことと同様に、私はMySQLのLOADDATAINFILEを見てみようと思います。Pythonで必要な前処理を行い、それをMySQLがアクセスできる別のファイルに書き込んでから、適切なクエリを実行して、MySQLにロードを実行させます。

または、Pythonコードをとにかくあるべきものに書き直してください(文字列操作を行うのではなく、パラメータを値として渡す必要があります-1つのSQLインジェクション攻撃):

query = 'insert into something(a, b, c, d) values(%s, %s, %s, %s)'
with open('file.tab') as fin:
    values = (row.split('\t')[:4] for row in fin)
    cursor.executemany(query, values)
于 2012-11-19T10:12:01.863 に答える
0
import os
import MySQLdb as mdb
import csv

def read_file():
    file_path = "/home/local/user/Main/Module-1.0.4/file_processing/part-00000.txt"
    with open('part-00000','r') as infile:
        file_open= csv.reader(infile, delimiter='\t')
        cache = []
        for line in file_open:
            cache.append(line)
            if len(cache) > 500:
                yield cache
                cache = []
        yield cache 

conn = mdb.connect(user='root', passwd='redhat', db='Xml_Data', host='localhost', charset="utf8")
cursor = conn.cursor()
query = "insert into PerformaceReport (campaignID, keywordID, keyword, avgPosition) VALUES (%s,%s,%s,%s)"
for rows in read_file():
    try:
        cursor.executemany(query, rows)
    except mdb.Error:
        conn.rollback()
    else:
        conn.commit()

コードはテストされておらず、マイナーエラーが含まれている可能性がありますが、使用するほど速くはなく、高速である必要がLOAD DATA INFILEあります。

于 2012-11-19T10:22:45.667 に答える