或者我应该使用不同的锤子来解决这个问题.
我有一个非常简单的用例来存储数据,实际上是一个稀疏矩阵,我试图将其存储在SQLite数据库中.我创建了一个表:
create TABLE data ( id1 INTEGER KEY, timet INTEGER KEY, value REAL )
Run Code Online (Sandbox Code Playgroud)
我插入了大量数据(每10分钟800个元素,每天45次),一年中大部分时间.(id1,timet)的元组将始终是唯一的.
时间值是自纪元以来的秒数,并且将始终增加.出于所有实际目的,id1是随机整数.虽然可能只有20000个独特的ID.
然后我想访问id1 == someid的所有值或访问timet == sometime的所有元素.在我通过Linux上的C接口使用最新SQLite的测试中,查找其中一个(或此查找的任何变体)大约需要30秒,这对我的用例来说还不够快.
我尝试为数据库定义一个索引,但这减慢了插入到完全不可行的速度(虽然我可能做错了...)
上表导致对任何数据的访问速度非常慢.我的问题是:
请原谅我对SQL的基本理解!
谢谢
我包含一个代码示例,显示使用索引时插入速度如何减慢到爬行速度.使用'create index'语句,代码需要19分钟才能完成.没有它,它会在18秒内运行.
#include <iostream>
#include <sqlite3.h>
void checkdbres( int res, int expected, const std::string msg )
{
if (res != expected) { std::cerr << msg << std::endl; exit(1); }
}
int main(int argc, char **argv)
{
const size_t nRecords = 800*45*30;
sqlite3 *dbhandle = NULL;
sqlite3_stmt *pStmt = NULL;
char statement[512]; …Run Code Online (Sandbox Code Playgroud) 在使用dlopen加载时,我遇到了一些异常无法正常运行的问题(或者至少,正如我希望的那样;我知道这有问题).我在这里包含一些简化的示例代码.实际情况是myapp = Matlab,myext1 = mexglx matlab扩展,mylib是我的代码在两个扩展之间的共享库(myext1,myext2)
mylib.h
struct Foo { Foo(int a); m_a; }
void throwFoo();
Run Code Online (Sandbox Code Playgroud)
mylib.cpp
#include "mylib.h"
Foo::Foo(int a): m_a(a) {}
void throwFoo() { throw Foo(123); }
Run Code Online (Sandbox Code Playgroud)
myext1.cpp
#include "mylib.h"
#include <iostream>
extern "C" void entrypoint()
{
try { throwFoo(); }
catch (Foo &e) { std::cout << "Caught foo\n"; }
}
Run Code Online (Sandbox Code Playgroud)
myext2.cpp与myext1.cpp相同
MyApp.cpp中
#include <dlfcn.h>
int main()
{
void *fh1 = dlopen("./myext1.so",RTLD_LAZY);
void *fh2 = dlopen("./myext2.so",RTLD_LAZY);
void …Run Code Online (Sandbox Code Playgroud) 我写了一个非常简单的python类,它等待socket上的连接.目的是将此类添加到现有应用程序中,并将数据异步发送到连接客户端.
问题是当等待socket.accept()时,我无法通过按ctrl-c结束我的应用程序.我也无法检测到我的课程何时超出范围并通知它结束.
理想情况下,以下应用程序应在time.sleep(4)到期后退出.正如您在下面看到的,我尝试使用select,但这也会阻止应用程序响应ctrl-c.如果我能在主方法中检测到变量'a'超出范围,我可以设置退出标志(并减少select的超时以使其响应).
有任何想法吗?
谢谢
import sys
import socket
import threading
import time
import select
class Server( threading.Thread ):
def __init__( self, i_port ):
threading.Thread.__init__( self )
self.quitting = False
self.serversocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
self.serversocket.bind( (socket.gethostname(), i_port ) )
self.serversocket.listen(5)
self.start()
def run( self ):
# Wait for connection
while not self.quitting:
rr,rw,err = select.select( [self.serversocket],[],[], 20 )
if rr:
(clientsocket, address) = self.serversocket.accept()
clientsocket.close()
def main():
a = Server( 6543 )
time.sleep(4)
if __name__=='__main__':
main()
Run Code Online (Sandbox Code Playgroud)
我在将带有iostream解析支持的类集成到精神解析器时遇到了一些麻烦.下面的示例(从Spirit示例中修改)演示了该问题.如果我尝试仅解析自定义类,它会成功,如第一个解析所示,并调用assert.如果我尝试解析自定义类以及(在本例中)逗号和浮点数,则解析器将失败.
任何人都可以说明为什么会这样吗?如果我使用精神解析器而不是流解析器,我可以使第二个示例工作,但这违背了使用stream_parser的目的.
我在本地示例中启用了规则调试,这表明自定义解析器使用了字符串的全部内容 - 但是,代码显示它不应该这样做...
任何帮助赞赏!
提升1.44.0,gcc 4.1.1
#include <boost/spirit/include/qi.hpp>
struct complex
{
complex (double a = 0.0, double b = 0.0) : a(a), b(b) {}
double a,b;
};
std::istream& operator>> (std::istream& is, complex& z)
{
char lbrace = '\0', comma = '\0', rbrace = '\0';
is >> lbrace >> z.a >> comma >> z.b >> rbrace;
if (lbrace != '{' || comma != ',' || rbrace != '}')
is.setstate(std::ios_base::failbit);
return is;
}
int main( int argc, char**argv)
{
using …Run Code Online (Sandbox Code Playgroud)