当前位置: 首页 > 知识库问答 >
问题:

Sqlite升序似乎不适用于对分

魏康安
2023-03-14

我正在使用二分模块搜索并将sha256哈希插入列表。

我有大约8,000,000项要搜索和添加,它们存储在sqlite数据库中,我想把它们读入列表,这样我就可以更快地搜索它们。

我遇到的问题是,使用二分法将项目插入列表以找到正确的插入点非常慢。完成所有8000000个项目大约需要700秒。

按升序在sqlite数据库中创建索引只需要大约90秒,然后依次将索引插入列表大约需要60秒。

问题是当我这样做的时候,对一些项目的二分搜索失败了,但是如果我依次搜索项目的哈希值,它实际上就在那里。

因此,似乎数据库提供的顺序与使用对分获取索引位置时提供的顺序并不完全相同。

知道为什么会这样吗?能够在依赖二分法之前对列表进行预先排序将非常有用。

更新...基于一个注释,我应该解释我有一个行为像列表的自定义类,它将哈希打包在字节数组中以节省内存。这是我的班级

class Hashlist():

def __init__(self, hashLen):
    self.__hashLen = hashLen
    self.__hashlist = bytearray()
    self.__num_items = 0

def __getitem__(self, index):
    if index >= len(self) or index < 0: 
        print index
        raise IndexError("hash index out of range")
        return 
    return str(self.__hashlist[index*self.__hashLen:(index+1)*self.__hashLen])

def __setitem__(self, index, data):
    if index > len(self) or index < 0: 
        raise IndexError("hash index out of range")
        return 
    if index == len(self):
        self.__hashlist.extend(data)
    else:
        self.__hashlist[index*self.__hashLen:(index+1)*self.__hashLen] = data

def insert(self, index, data):
    oldlen = len(self.__hashlist)/self.__hashLen
    if index > oldlen  or index < 0:
        raise IndexError("trying to insert past next element")
        return
    if index == oldlen:
        self.__hashlist.extend(data)
    else:
        # move the data
        if self.__hashLen == 1:
            self.__hashlist.append(chr(0))
            orig_data = str(self.__hashlist[(index):(len(self.__hashlist)-1)])
            self.__hashlist[(index + 1)*self.__hashLen:(len(self.__hashlist))*self.__hashLen] = orig_data
            #replace existing data
            self.__hashlist[index*self.__hashLen:(index+1)*self.__hashLen] = data
        else:
            orig_data = str(self.__hashlist[(index*self.__hashLen):(len(self.__hashlist) -1)*self.__hashLen])
            self.__hashlist[(index + 1)*self.__hashLen:(len(self.__hashlist))*self.__hashLen] = orig_data
            #replace existing data
            self.__hashlist[index*self.__hashLen:(index+1)*self.__hashLen] = data

谢谢

院长

共有1个答案

归俊捷
2023-03-14

如果它们存储在SQL数据库中,索引不能保证结果以“排序”顺序返回-必须使用“排序依据”来显式显示。

另外,如果你要做那么多的插入,那么我不会使用对分,而是排序/合并。

# Add new to old and sort the whole lot...
old_hash_list.extend(new_hash_list)
old_hash_list.sort()

# Assuming new is already sorted than create new list of merged
import heapq
old_and_new = list(heapq.merge(old_hash_list, sorted(new_hash_list)))
 类似资料:
  • 问题内容: 我需要在我的老师不让我们使用IDE的前提下对此进行开头。我们使用TextPad。我要单击此标签,然后将其从“ H”更改为“ T”。目前,当我单击标签时,没有执行任何操作。我忘记了什么? 问题答案: 您的工具,但您还需要告知将事件发送给自己。在构造函数的最后,您需要说 如果您还记得可以将 任何 类放入,并且必须将您的侦听器连接到,则这更有意义。本身是侦听器这一事实并不能免除您的这种责任。

  • 我一直在使用URLConnection。guessContentTypeFromName(String fname)来检测我需要在标头中使用什么mime类型来返回不同的文档。 在我用测试程序测试之前,它工作得很好 。我可以通过测试使它工作。jpg或测试。pdf,但不带测试。csv。 我没有问题获得pdf和jpg扩展的良好mimetype,但csv扩展接收null。 我似乎在谷歌上找不到任何理由来解

  • 我正在遵循斯普林特启动的15分钟指南(gs-关系-数据-访问) 因此,该指南使用H2数据库。现在我通过在运行时提供JAR来改变这一点,以使用DB2。 改良build.gradle 现在应用程序失败了,抱怨没有找到JDBCTemplateBean定义或类似的东西。 所以现在我进一步修改了build.gradle注释掉sping-jdbc,并使用sping-boo-starter-jdbc 现在,应用

  • 我在试硒。我已经使用Selenium IDE构建了一个快速脚本。它登录到一个页面,打开一个“搜索”窗口,进行搜索,然后打开其中一个结果。 当我在Selenium IDE中运行测试时,它运行良好。当我导出到Java JUnit 4测试用例时,它运行良好。但当我导出到Python2单元测试时,xpath搜索似乎有很多问题。。。 例子: 该页面有一个名为class='keyword'的输入元素。当我使用

  • 我实际上试图解决一个问题,Maven抱怨文件中缺少参数的vaule。因此,我决定通过将选项放在Jenkins中来调试Maven。但它抱怨我输入了一个不正确的Java参数: Jenkins认为我支持Java。后来我发现Jenkins生成的命令是这样的: /usr/java/jdk1.7.0_17/bin/java-x-cp/var/lib/jenkins/plugins/maven-plugin/w

  • 问题内容: 嗨,我的应用程序访问Postgres数据库,并且我有很多预定义的查询(Rank,Parition,complex join等)对Postgres触发。现在,我要使用小的测试数据对这些查询行为进行单元测试。所以我从H2 / Junit开始。我发现大多数Postgres查询,例如Rank,Partition,更新时的复杂情况等。因此,我想到使用所有H2 PosgreSQL兼容模式,因为我认