本文演示了采用Python脚本,配合MongoDB数据库,读取股票数据文件,并写入数据库的过程。 导入数据库的方法支持单线程及多线程两种方式。经过本地开发机测试,开启2-3个线程时,导入速度快于单线程导入;当开启线程超过4个之后,导入速度反而小于单线程;猜测可能是跟机器CPU核心数有关,建议开始CPU核心数N-1的线程。例如,若CPU核心数为8时,可以开启7个线程进行导入,可大幅提高导入速度。 Python操作MongoDB,需要引入pymongo模块,可自行搜索该模块的安装方法,不再赘述。以下是Python代码:
util_file.py 读取数据文本,导入数据库的公共方法类
#!/usr/bin/env python
#coding:utf-8
import threading
import pymongo
import time
class UtilFile:
def IsSubString(SubStrList,Str):
flag=True
for substr in SubStrList:
if not(substr in Str):
flag=False
return flag
def GetFileList(FindPath,FlagStr=[]):
import os
FileList=[]
FileNames=os.listdir(FindPath)
if (len(FileNames)>0):
for fn in FileNames:
if (len(FlagStr)>0):
#返回指定类型的文件名
if (UtilFile.IsSubString(FlagStr,fn)):
#fullfilename=os.path.join(FindPath,fn)
#FileList.append(fullfilename)
FileList.append(fn)
else:
#默认直接返回所有文件名
#fullfilename=os.path.join(FindPath,fn)
#FileList.append(fullfilename)
FileList.append(fn)
#对文件名排序
if (len(FileList)>0):
FileList.sort()
return FileList
'''
函数功能:读取通达信数据导出文件内容,导入到数据库中
入参:
conn_db: 导入所使用的数据库
file_dir: 数据文件目录
file_list: 数据目录下文件名List
file_type: 数据文件类型。枚举值。 M1:1分钟线数据; D: 日线数据
tb_pre_name: 数据表名称前缀
print_level: 打印级别。枚举值。0:不打印; 1:按文件打印; 2:按记录打印
thread_name: 线程名称(打印输出用)
'''
def ImpDataFromFile(conn_db, file_