我买了Kibot的股票数据,这是巨大的.我有大约125,000,000行要加载(1000股*125k行/股票[自2010-01-01以来的1分钟条形数据],每个股票在CSV文件中,其字段为日期,时间,开盘价,最高价,最低价,收盘价,体积).我对python完全不熟悉(我之所以选择它是因为它是免费的并得到了社区的支持)而且我选择了SQLite来存储数据,因为python内置了对它的支持.(而且我非常了解SQL语言.SQLiteStudio是一个免费程序的宝石.)
我的加载程序运行良好,但速度越来越慢.SQLite数据库大约是6 Gb,它只有一半加载.我使用INSERT语句加载大约500k行/小时,并在每个库存(大约125k行)之后提交事务.
所以这就是问题:PyTables是否比SQLite快得多,努力学习如何使用它值得吗?(而且因为我处于学习模式,所以可以自由地提出这两个方案的替代方案.)让我烦恼的一件事就是PyTables,它实际上是免费版本,几乎就像保存二进制文件一样.没有"where子句"功能或索引,因此您最终扫描所需的行.
在我加载数据后,我将使用基于NumPy的东西进行统计分析(滚动回归和相关等):时间序列,拉里,熊猫或scikit.我还没有选择分析包,所以如果您有推荐,并且该建议最好与PyTables或pandas(或其他)一起使用,请将其纳入您的回复中.
(对于@John)Python 2.6;
Windows XP SP3 32位;
用作INSERT语句的制造字符串;
2G物理内存的内存使用率为750M;
CPU使用率为10%+/ - 5%;
完全i/o绑定(磁盘始终处于运算状态).
数据库架构:
create table MinuteBarPrices (
SopDate smalldatetime not null,
Ticker char( 5 ) not null,
Open real,
High real,
Low real,
Close real not null,
Volume int,
primary key ( SopDate, Ticker )
);
create unique index MinuteBarPrices_IE1 on MinuteBarPrices (
Ticker,
SopDate
);
Run Code Online (Sandbox Code Playgroud) 我尝试在Python中使用线程(ThreadingMixIn)编写TCPServer.问题是socket.error: [Errno 48] Address already in use当我尝试再次运行它时,我无法正常关闭它.这是触发问题的python代码的最小示例:
import socket
import threading
import SocketServer
class FakeNetio230aHandler(SocketServer.BaseRequestHandler):
def send(self,message):
self.request.send(message+N_LINE_ENDING)
def handle(self):
self.request.send("Hello\n")
class FakeNetio230a(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
def __init__(self, server_address, RequestHandlerClass):
self.allow_reuse_address = True
SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass)
if __name__ == '__main__':
for i in range(2):
fake_server = FakeNetio230a(("", 1234), FakeNetio230aHandler)
server_thread = threading.Thread(target=fake_server.serve_forever)
server_thread.setDaemon(True)
server_thread.start()
# might add some client connection here
fake_server.shutdown()
Run Code Online (Sandbox Code Playgroud)
所有主要代码应该是启动服务器,关闭它并再次运行它.但它会触发上述错误,因为套接字在第一次关闭后尚未释放.
我认为这个设置self.allow_reuse_address = True可以解决问题,但这不起作用.当python程序完成后,我可以立即再次运行它,它可以启动服务器一次(但不是两次).
然而,当我随机端口(更换问题了1234由1234+i为例),因为没有其他服务器监听该地址.
有一个类似的SO Q 从ThreadingTCPServer正常关闭,但解决方案(设置allow_reuse_address为True …