- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个函数可以访问我的 Sqlite 数据库,该数据库在 100 个表中包含大约 100,000 行。 (数据库文件大小约为 2-3GB)我试图给我的函数一个时间点,我希望它返回与给定时间点最接近的行。按照我现在设置的方式,我必须运行此函数数百万次,并且我发现查询的运行时间约为 30-35 毫秒。我需要显着加快速度,有人可以建议一些修复吗?
我尝试过的事情:如果我删除查询的“ORDER BY”部分,它的速度几乎会提高一个数量级,但我不确定如何在没有它的情况下获得最接近的时间点。我尝试将数据库加载到内存中,但这实际上使它变慢,因为将数据库加载到内存中花费了额外的时间。我已经并行化了 44 个进程的调用,但设置进程需要很长时间(将变量复制到内存?),但更重要的是,只有 ~8 个进程 100% 工作,而且仍然太慢。
我确实只为 _timestamp 列索引了数据库。
有谁知道一种方法可以绕过我的整个问题,重新组织我的数据库,更改我的查询,提出一种更好的方法在数据库内部或外部进行搜索,甚至帮助我确定限制因素是什么?我正在开发一台 24 核/48 线程服务器,内存约为 140GB。
def getClosestRow(conn, table, timepoint):
query = "SELECT * FROM "+str(table)+" ORDER BY ABS("+str(timepoint)+" - _timestamp) LIMIT 1"
result = conn.execute(query)
for x in result:
return x
return None
这是我用来索引数据库的函数:
def indexAllTablesWithColumn(conn, column):
tableList = getListOfTablesInDatabase(conn)
for tableName in tableList:
command = "CREATE INDEX idx_"+column+tableName+" ON "+tableName+"("+column+");"
results = conn.execute(command)
conn.commit()
我做了 sqlite3 database.db .schema > schema.sql 建议并得到了巨大的输出。我将把头和尾放在这里,因为中间的所有内容似乎只是具有不同名称的各种表。该数据库包含抓取的加密货币数据,每个表都是不同的“硬币”,每一列都是不同的特征,每一行都是不同的时间点。
Head:
CREATE TABLE _BTC_BITCOIN(id integer PRIMARY KEY,_timestamp TEXT,_24h_volume_usd REAL,_available_supply REAL,_id TEXT,_last_updated INTEGER,_market_cap_usd INTEGER,_max_supply REAL,_name TEXT,_percent_change_1h REAL,_percent_change_24h REAL,_percent_change_7d REAL,_price_btc REAL,_price_usd REAL,_rank INTEGER,_symbol TEXT,_total_supply REAL);
CREATE TABLE _ETH_ETHEREUM(id integer PRIMARY KEY,_timestamp TEXT,_24h_volume_usd REAL,_available_supply REAL,_id TEXT,_last_updated INTEGER,_market_cap_usd INTEGER,_max_supply REAL,_name TEXT,_percent_change_1h REAL,_percent_change_24h REAL,_percent_change_7d REAL,_price_btc REAL,_price_usd REAL,_rank INTEGER,_symbol TEXT,_total_supply REAL);
CREATE TABLE _XRP_RIPPLE(id integer PRIMARY KEY,_timestamp TEXT,_24h_volume_usd REAL,_available_supply REAL,_id TEXT,_last_updated INTEGER,_market_cap_usd INTEGER,_max_supply REAL,_name TEXT,_percent_change_1h REAL,_percent_change_24h REAL,_percent_change_7d REAL,_price_btc REAL,_price_usd REAL,_rank INTEGER,_symbol TEXT,_total_supply REAL);
CREATE TABLE _BCH_BITCOIN_CASH(id integer PRIMARY KEY,_timestamp TEXT,_24h_volume_usd REAL,_available_supply REAL,_id TEXT,_last_updated INTEGER,_market_cap_usd INTEGER,_max_supply REAL,_name TEXT,_percent_change_1h REAL,_percent_change_24h REAL,_percent_change_7d REAL,_price_btc REAL,_price_usd REAL,_rank INTEGER,_symbol TEXT,_total_supply REAL);
CREATE TABLE _LTC_LITECOIN(id integer PRIMARY KEY,_timestamp TEXT,_24h_volume_usd REAL,_available_supply REAL,_id TEXT,_last_updated INTEGER,_market_cap_usd INTEGER,_max_supply REAL,_name TEXT,_percent_change_1h REAL,_percent_change_24h REAL,_percent_change_7d REAL,_price_btc REAL,_price_usd REAL,_rank INTEGER,_symbol TEXT,_total_supply REAL);
CREATE TABLE _ADA_CARDANO(id integer PRIMARY KEY,_timestamp TEXT,_24h_volume_usd REAL,_available_supply REAL,_id TEXT,_last_updated INTEGER,_market_cap_usd INTEGER,_max_supply REAL,_name TEXT,_percent_change_1h REAL,_percent_change_24h REAL,_percent_change_7d REAL,_price_btc REAL,_price_usd REAL,_rank INTEGER,_symbol TEXT,_total_supply REAL);
CREATE TABLE _NEO_NEO(id integer PRIMARY KEY,_timestamp TEXT,_24h_volume_usd REAL,_available_supply REAL,_id TEXT,_last_updated INTEGER,_market_cap_usd INTEGER,_max_supply REAL,_name TEXT,_percent_change_1h REAL,_percent_change_24h REAL,_percent_change_7d REAL,_price_btc REAL,_price_usd REAL,_rank INTEGER,_symbol TEXT,_total_supply REAL);
CREATE TABLE _XLM_STELLAR(id integer PRIMARY KEY,_timestamp TEXT,_24h_volume_usd REAL,_available_supply REAL,_id TEXT,_last_updated INTEGER,_market_cap_usd INTEGER,_max_supply REAL,_name TEXT,_percent_change_1h REAL,_percent_change_24h REAL,_percent_change_7d REAL,_price_btc REAL,_price_usd REAL,_rank INTEGER,_symbol TEXT,_total_supply REAL);
CREATE TABLE _XMR_MONERO(id integer PRIMARY KEY,_timestamp TEXT,_24h_volume_usd REAL,_available_supply REAL,_id TEXT,_last_updated INTEGER,_market_cap_usd INTEGER,_max_supply REAL,_name TEXT,_percent_change_1h REAL,_percent_change_24h REAL,_percent_change_7d REAL,_price_btc REAL,_price_usd REAL,_rank INTEGER,_symbol TEXT,_total_supply REAL);
CREATE TABLE _EOS_EOS(id integer PRIMARY KEY,_timestamp TEXT,_24h_volume_usd REAL,_available_supply REAL,_id TEXT,_last_updated INTEGER,_market_cap_usd INTEGER,_max_supply REAL,_name TEXT,_percent_change_1h REAL,_percent_change_24h REAL,_percent_change_7d REAL,_price_btc REAL,_price_usd REAL,_rank INTEGER,_symbol TEXT,_total_supply REAL);
Tail:
CREATE INDEX idx__timestamp_VZT_VEZT ON _VZT_VEZT(_timestamp);
CREATE INDEX idx__timestamp_SKB_SAKURA_BLOOM ON _SKB_SAKURA_BLOOM(_timestamp);
CREATE INDEX idx__timestamp_FID_FIDELIUM ON _FID_FIDELIUM(_timestamp);
CREATE INDEX idx__timestamp_MOAC_MOAC ON _MOAC_MOAC(_timestamp);
CREATE INDEX idx__timestamp_NKN_NKN ON _NKN_NKN(_timestamp);
CREATE INDEX idx__timestamp_CLO_CALLISTO_NETWORK ON _CLO_CALLISTO_NETWORK(_timestamp);
CREATE INDEX idx__timestamp_SWTH_SWITCHEO ON _SWTH_SWITCHEO(_timestamp);
CREATE INDEX idx__timestamp_TUBE_BITTUBE ON _TUBE_BITTUBE(_timestamp);
CREATE INDEX idx__timestamp_BETR_BETTERBETTING ON _BETR_BETTERBETTING(_timestamp);
CREATE INDEX idx__timestamp_LYL_LOYALCOIN ON _LYL_LOYALCOIN(_timestamp);
最佳答案
SELECT *
FROM MyTable
ORDER BY ABS(? - _timestamp)
LIMIT 1;
该查询简单且正确,但无法使用索引优化查找。 (即使使用 expression index 也不行,因为函数参数发生变化,因此无法存储结果。)
如果您计算其他内容,您将获得快速查询:等于或晚于时间戳的最近行:
SELECT *
FROM MyTable
WHERE _timestamp >= ?
ORDER BY _timestamp
LIMIT 1;
要获得正确的结果,请计算最近的两行之前和之后,然后计算时间戳,然后取差异最小的行(对两行进行排序很快) :
SELECT *
FROM (SELECT *
FROM MyTable
WHERE _timestamp >= ?
ORDER BY _timestamp ASC
LIMIT 1)
UNION ALL
SELECT *
FROM (SELECT *
FROM MyTable
WHERE _timestamp <= ?
ORDER BY _timestamp DESC
LIMIT 1)
ORDER BY ABS(? - _timestamp)
LIMIT 1;
关于python - 如何快速找到 sqlite 数据库中最接近给定输入的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50726104/
我想创建一个返回值的方法(我们称之为“z”)。它的值由另一个值决定(我们称之为“y”)。基本上我想要的是满足以下条件: 当 x 接近 0 时,z 接近 100。 当 x 接近无穷大时,z 接近 0。
我正在尝试使用 Java 中的PreparedStatement 执行查询。 当我尝试执行查询时,收到错误号 1064(语法错误)。 我已经在 MySQL 查询浏览器中使用替换值对此进行了测试,效果很
我正在开发一个应用程序来解析 Scala 中的命令。命令的一个例子是: todo get milk for friday 所以计划是让一个非常智能的解析器将行分开并识别命令部分以及字符串中有时间引用的
来自 http://directwebremoting.org/dwr/reverse-ajax/index.html ,它表示它支持轮询、 cometd 、搭载。这是否意味着当我们实现这种方法时,我
我开始研究一个概念,该概念要求我找到一种方法,以给定的速度将矩形移向给定的点。我正在为 Android 开发,所以这对速度非常关键(它也将针对可能的数百个对象计算每一帧。) 我能想到的解决方案如下:
我正在处理一个处理“门票”的表(状态=“开放”或状态=“关闭”)。当票证关闭时,相关系统不会更改状态,而是会创建一个具有“已关闭”状态的重复条目。 对于“ticket_number”关键字段,如果存在
我正在尝试在 python 中执行一些 n-gram 计数,我想我可以使用 MySQL(MySQLdb 模块)来组织我的文本数据。 我有一个很大的表,大约有 1000 万条记录,代表由唯一数字 ID(
我正在尝试将数据添加到 mariadb 表中。我想将 val0 到 val5 作为查询的值传递。但我收到错误 OperationalError: close "%": 语法错误代码 list_Valu
我正在使用 (Py)OpenGL 显示 256 色索引图像。我将着色器与包含调色板的一维纹理一起使用。这是片段着色器代码: #version 330 uniform sampler2D texture
对于我的元素 areallybigpage.com (*),我想看看我们能用 CSS 的 transform: scale(...) 走多远。 这有效并以正常大小显示文本: #id1 { positi
我有两列带有数字数据的 Pandas 表(dtype flaot64)。 我将每列四舍五入到小数点后有 2 位数字,然后使用函数将其四舍五入到接近 0.5,但由于某种原因,只有一列四舍五入为 0.05
我正在构建一个由用户登录和注册组成的应用程序,但每次我在模拟器上测试它时,我都会收到强制关闭。以下是我在日志猫中收到的错误: 08-14 14:06:28.853: D/dalvikvm(828):
我正在尝试在 Python 中实现 Strassen 矩阵乘法。我已经让它发挥了一些作用。这是我的代码: a = [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]] b
为什么这不起作用?这与 = 附近的命令字符串语法有关,但我似乎无法弄清楚,在线示例似乎完全相同。编辑: Activated In 是一列。 示例来自 How to select data from d
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及
我有一个测试区,它是来自数据库的动态文本,可能有数千个单词。我希望它中断并在每段中用句号将近 100 个(任意长度)单词作为一个段落。我能够在 100 个单词后中断,但不能完全停止。为了在 100 个
我是 hadoop 和 hive 的新手。我正在尝试将数据加载到配置单元表中,但遇到以下错误。 另一方面,我尝试使用语句 stmt.execute("INSERT INTO employee VALU
这是来自一个统计项目。我定义了下面的函数,但是当n接近400时,第二个方法很慢。第一个方法很好(这里有人帮助了我in this question) import Math.Combinatorics.
我正在尝试创建一个 css 侧边菜单,但是当我关闭菜单并将 div 容器宽度设置为 0 时,链接仍然可见。 这是 jsfiddle - https://jsfiddle.net/atLvp6k7/ 有
我对 MySQL 还很陌生。我必须使用输出参数调用存储过程。我在互联网上搜索了很多,但没有找到解决我的问题的正确方法。如果我使用 @outputParamName 调用存储过程,它会说我在 NULL
我是一名优秀的程序员,十分优秀!