小编Bri*_*edy的帖子

SQLite可以处理9000万条记录吗?

或者我应该使用不同的锤子来解决这个问题.

我有一个非常简单的用例来存储数据,实际上是一个稀疏矩阵,我试图将其存储在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秒,这对我的用例来说还不够快.

我尝试为数据库定义一个索引,但这减慢了插入到完全不可行的速度(虽然我可能做错了...)

上表导致对任何数据的访问速度非常慢.我的问题是:

  • SQLite完全是错误的工具吗?
  • 我可以定义索引以显着加快速度吗?
  • 我应该使用像HDF5而不是SQL这样的东西吗?

请原谅我对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)

sql sqlite

41
推荐指数
5
解决办法
4万
查看次数

没有RTLD_GLOBAL的typeinfo,共享库和dlopen()

在使用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)

c++ matlab exception shared-libraries dlopen

10
推荐指数
2
解决办法
4570
查看次数

Python套接字接受块 - 防止应用程序退出

我写了一个非常简单的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)

python sockets

8
推荐指数
1
解决办法
6118
查看次数

boost :: spirit stream_parser消耗太多了?

我在将带有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)

c++ boost boost-spirit

4
推荐指数
1
解决办法
333
查看次数