0

データをフォーマットする最良の方法は何ですか?

背景は次のとおりです。

nameparserを使用して、可能な限り最善の方法で名前を解析しています。nameparser を呼び出し、解析された名前をデータベース (MySQL) に格納するラッパーを作成しました。

この場合、どのようなアプローチが最も効率的でしょうか? 以下は私のアプローチです。

  1. ステップ 1 : nameparser を呼び出します (tablename、id、name、first、middle、last、suffix を提供します)。
  2. ステップ 2: 解析された (返された) 名前を、この形式の dict にメモリに保存します (比較的小さな名前セットを解析しています - たとえば 20,000 個の名前)。{id:{'first':'John', 'middle':'V', 'last':'Doe', 'suffix':''}
  3. ステップ 3 : 1 つのクエリで dict を MySQL テーブルに保存しますか? (手順 2 で説明したデータ構造で可能かどうかはわかりません。

これが私のコードです:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from nameparser import HumanName

import time

cursor = db.cursor()


def name(table, id, name, first, middle, last, suffix):

    cursor.execute('SELECT `' + id + '`,`' + name + '` FROM `' + table
                   + '` WHERE `' + name + '` IS NOT NULL AND ' + id
                   + ' IS NOT NULL')

    numrows = int(cursor.rowcount)
    namelist = []
    namelist = cursor.fetchall()

    for record in namelist:
        parsed = HumanName(record[1])
        parsed.capitalize()
        mydict[int(record[0])] = {
            'first': str(parsed.first),
            'middle': str(parsed.middle),
            'last': str(parsed.last),
            'suffix': str(parsed.suffix),
            }   

mydict = {}

starttime = time.time()

split = name('NamesToParse','id','name','first','middle','last','suffix')
print mydict
print time.time() - starttime

MySQL テーブルにデータを保存する最良の方法を提案してください。これは私がこれまでに持っているものであり、各レコードをループする必要があります。update最初に一時テーブルを作成してから元のテーブルを一度に更新するのではなく、既存のテーブルへの方法があるかどうか疑問に思っていますか? 私が理にかなっていることを願っています。

for id, val in mydict.items():

    sorted_keys = sorted(map(str, val.keys()))
    sorted_vals = map(encoding, [val[mydict] for mydict in sorted_keys])  # sorted by keys
    formatted = ', '.join(["'%s'"] * len(sorted_vals))
    db.execute("""insert into NamesToParseOut(%s) values (%s)""" % (', '.join(sorted_keys), formatted), sorted_vals)
4

1 に答える 1

0

タプルのリストアプローチを採用し、最初に一時テーブルに挿入してから、元のテーブルで更新するようです。時間の節約は驚くべきものです。辞書はこの仕事にはやり過ぎだと思います。

mylistoftuples.append((int(record[0]), str(parsed.first),str(parsed.middle),str(parsed.last),str(parsed.suffix)))

cursor.executemany("""insert into NamesToParseOut(id, first, middle, last, suffix) values (%s, %s, %s, %s, %s)""", mylistoftuples)
于 2012-08-23T18:45:40.090 に答える