python+mysql:实现python造1000万条数据并快速插入数据库,速度对比 |
您所在的位置:网站首页 › sql随机生成身份证号 › python+mysql:实现python造1000万条数据并快速插入数据库,速度对比 |
要求:
造一千万条个人数据,包括:姓名、生日、身份证、证件类型、性别、民族等每个人随机分配到20个组其中之一
实现思路:
思路一:用python生成1000万条数据并写入txt文件,再用pymysql写入数据库思路二:用for循环不断写进变量,分批次插入数据库
实现过程:
思路一 很快就被否定了,因为在写入txt的文件过程中,随着数据量越来越大,速度成线性下降,导致代码跑了一晚上也没写完,更别说插入了,即使用load data也没法补救前期写数据的时间。 思路二 在实现的过程中变量随着数据堆积,速度也会越来越慢,也是成线性下降, 所以循环10000次后就执行一次插入: for i in tqdm(range(begin, end)): # tqdm: python的进度条库 if i % 10000 == 0: sql = sql.strip(',\n') try: db.ping(reconnect=True) cur = db.cursor() cur.execute(sql) db.commit() cur.close() db.close() del sql # 删除变量 gc.collect() # 回收内存空间 except Exception as e: print(e)插入变量后直接删除变量,用python自带的gc.collect回收内存空间,这样可以提高下次变量赋值的速度; 结果: 单进程 : insertSQl(1, 10000001)结果 耗时30:27 100%|█████████████████████████████| 10000000/10000000 [30:27 None: print(self.threadName + '开始执行') threadLock.acquire() insertSQl(self.threadName, self.begin, self.end) threadLock.release() print(self.threadName + '结束执行') if __name__ == '__main__': threadLock = threading.Lock() threads = [] thread1 = myThread('thread1', 1, 1250001) thread2 = myThread('thread2', 1250001, 2500001) thread3 = myThread('thread3', 2500001, 3750001) thread4 = myThread('thread4', 3750001, 5000001) thread5 = myThread('thread5', 5000001, 6250001) thread6 = myThread('thread6', 6250001, 7500001) thread7 = myThread('thread7', 7500001, 8750001) thread8 = myThread('thread8', 8750001, 10000001) thread1.start() thread2.start() thread3.start() ...... threads.append(thread1) threads.append(thread2) threads.append(thread3) ...... for t in threads: t.join()结果 耗时30:57,这是我没想到的,应该是我用错了,对线程不是很了解。。。 结果 耗时7:06 从结果看多进程的效率要比其他的好的多,翻了四五倍。水平有限,如果还有什么更好的办法,欢迎分享给我~~~ |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |