1.Elasticsearch Query详解
2.elasticsearch wildcard 慢查询原因分析(深入到源码!!!)
3.PostgreSQL源码学习笔记(6)-查询编译
4.es lucene搜索及聚合流程源码分析
5.求C语言源代码 题目 学生成绩管理系统
6.七爪源码:如何使用 Java 访问 BigQuery 数据仓库
Elasticsearch Query详解
filter和query是询源询工Elasticsearch中两个重要的概念。
filter不参与评分,码查码它的具源目标只是判断某个条件是或者否,并且可以利用缓存提高效率。询源询工
而query则会计算评分,码查码它的具源网页版冰墩墩源码目标是为了判断相关性,但由于计算评分,询源询工效率比filter要低。码查码
index、具源search和storestore、询源询工_source和doc_values是码查码Elasticsearch中的几个关键概念。
我们可以将Elasticsearch对数据的具源存储查询过程分为三个阶段:索引(index)、查询(search)和取回(fetch)。询源询工
在索引阶段,码查码Elasticsearch会解析源文档,具源按照mapping配置和字段配置对字段进行索引,并将整个源文档存储(如果没有禁用_source),将指定的字段进行store存储,另外还会为指定字段建立doc_values存储(如果doc_values可用)。
在查询阶段,Elasticsearch会解析query DSL,通过索引或doc_values对字段进行检索和过滤,找到符合条件的文档ID,对于需要聚合计算的,会取出文档并进行计算。
在取回阶段,Elasticsearch会根据需求返回指定的字段,指定_source,fields,或者docvalue_fields,这三个对应三个不同的存储位置,它们的作用也不同。
fields、_source、stored_fields、dedeapp源码docvalue_fields都是用来获取自己想要的字段,其中ES推荐使用fields。
fields和_source类似,但是fields会从_source中取出相应的字段数据并按照mapping设置进行一些格式处理、运行时字段计算等。
stored_fields是用来取出被store的字段,通常不建议使用。
docvalue_fields是用来取出建立了doc_values的字段,但部分类型可能不支持。
检索特性中的collapse字段折叠可以根据特定的字段进行分组,每组都返回结果,例如搜索手机时,可以按品牌字段进行折叠,返回每个品牌的可排序、过滤的数据。
filter过滤有两种使用方式。
highlight高亮是对存在检索关键词的结果字段添加特殊标签,ES支持三种Highlighter。
Highlighter的工作原理是对于一个查询,Highlighter需要找到最佳的文本片段并且高亮目标词句,这需要解决以下三个问题。
async异步搜索支持异步查询,可以使用get async search查看检索的运行状态。
near real-time近实时搜索添加或更新文档不会修改旧的索引文件,而是将新文件写入缓存,延迟刷盘,可以通过API强制更新索引。
pagination分页支持普通分页、深度分页scroll和search after。
inner hits可以查询出不同阶段文档命中,例如在字段折叠中,可以查询出每个分组下具体有哪些文档。
selected field可以返回需要的字段,使用_source filter、暗堡源码fields、docvalue_fields、stored_fields返回需要的文档字段。
across clusters分布式检索支持多种检索API的分布式搜索。
multiple indices多索引检索支持同时从多个索引检索数据。
shard routing分片路由可以提高容错和检索能力。
自定义检索模板search templates可以复用检索模板,根据不同变量生成不同的query DSL,使用Mustache语法。
同义词检索search with synonyms可以定义同义词集,提高检索准确度。
排序sort results支持多字段、数组字段、嵌套字段排序。
所有的检索特性可以查看官方文档。
query用于回答相似度是多少的问题,计算评分。
filter用于回答是或否的问题,不计算评分,可使用缓存,效率更高。
组合查询BooleanBoosting在ik分词测试时,需要将analyzer和search_quote_analyzer设置成一样的分词器,才能正确检索出结果。
match_phrase容易受到停用的影响,不配置ik的停用词影响match搜索,配置之后影响match_phrase,需要修改源码。
elasticsearch wildcard 慢查询原因分析(深入到源码!!!)
本文深入剖析 Elasticsearch 中 wildcards 查询导致的性能问题及其解决之道,结合源码解析,揭示其背后的机制。阅读本文后,您将深入了解 Elasticsearch 的查询过程、查询性能瓶颈以及如何利用 Elasticsearch profile API 进行性能分析。美金源码
首先,理解 Elasticsearch 的查询流程分为两个阶段:使用 Elasticsearch 对卢瑟库(Lucece)进行查询,以及卢瑟库本身进行查询。卢瑟库只能单机存储,因此,查询过程主要关注如何高效地在卢瑟库中查找文档。
在卢瑟库中,查询过程涉及以下关键步骤:重写(rewrite)查询类型、创建权重对象、构建 bulk scorer 对象以及进行打分。重写阶段将复杂查询转换为更底层的查询类型,如 MultiTermQueryConstantScoreWrapper。权重对象用于计算文档的权重和构建得分对象,以确定文档的排序。打分阶段对匹配的文档进行批量化打分,然后通过收集器对象汇总结果。
理解卢瑟库查询过程的关键在于了解其查询机制,尤其是如何筛选匹配文档。卢瑟库的查询过程包括创建 bulk scorer 对象,以及在 scorer 对象中遍历匹配的文档。PhraseQuery 和 WildcardQuery 类型的查询分别在不同的阶段进行文档筛选。WildcardQuery 的主要耗时发生在构建 scorer 阶段,由于其需要遍历字段中的所有 term 并与有限状态机进行匹配,此过程较为耗时且对 CPU 资源消耗较大。
在性能分析方面,Elasticsearch 提供了 profile API,允许在查询时收集分析结果。通过装饰器模式,profile API 在关键方法前后添加了埋点,以统计耗时时间。分析 profile 返回的结果,可以揭示查询在不同阶段的性能瓶颈,例如在构建 scorer 阶段的耗时。了解这些信息对于优化查询性能和资源利用至关重要。源码相除
综上所述,本文旨在深入探究 Elasticsearch wildcards 查询的性能问题,揭示其工作原理以及如何通过分析性能数据进行优化。通过本文的讲解,您将能够更好地理解 Elasticsearch 的查询过程、识别性能瓶颈,并采取有效措施提升系统性能。
PostgreSQL源码学习笔记(6)-查询编译
查询模块是数据库与用户进行交互的模块,允许用户使用结构化查询语言(SQL)或其它高级语言在高层次上表达查询任务,并将用户的查询命令转化成数据库上的操作序列并执行。查询处理分为查询编译与查询执行两个阶段:
当PostgreSQL的后台进程Postgres接收到查询命令后,首先传递到查询分析模块,进行词法,语法与语义分析。用户的查询命令,如SELECT,CREATE TABLE等,会被构建为原始解析树,然后交给查询重写模块。查询重写模块根据解析树及参数执行解析分析及规则重写,得到查询树,最后输入计划模块得到计划树。
整个查询编译的函数调用流程包括查询分析、查询重写与计划生成三个阶段。查询分析涉及词法分析、语法分析与语义分析,分别由Lex与Yacc工具完成。词法分析识别输入的SQL命令中的模式,语法分析找出这些模式的组合,形成解析树。出于与用户交互的考虑,语义分析与重写放在另一个函数处理,以避免在输入语句时立即执行事务操作。Lex与Yacc是词法与语法分析工具,分别通过正则表达式解析与语法结构定义,生成用于分析的C语言代码。
查询分析由pg_parse_query函数与pg_analyze_and_rewrite函数完成。pg_parse_query处理词法与语法分析,而语义分析与重写在pg_analyze_and_rewrite函数中进行。语义分析需要访问数据库系统表,以检查命令中的表或字段是否存在,以及聚合函数的适用性。
查询重写核心在于规则系统,存储在pg_rewrite系统表中。规则系统由一系列重写规则组成,包括创建规则、删除规则以及利用规则进行查询重写三个操作。规则系统提供定义、删除规则以及利用规则优化查询的功能。PG中实现多种查询优化策略,包括谓语下滑、WHERE语句合并等,通过动态规划与遗传算法选择代价最小的执行方案。
查询规划的总体过程包括预处理、生成路径和生成计划三个阶段。预处理阶段消除冗余条件、减少递归层数与简化路径生成。提升子链接与子查询是预处理中的关键步骤,通过将子查询提升至与父查询相同的优化等级,提高查询效率。提升子链接与子查询的函数包括pull_up_sublinks与pull_up_subqueries。
在路径生成阶段,优化器检查MIN/MAX聚集函数的存在与索引条件,生成通过索引扫描获得最大值或最小值的路径。表达式预处理由preprocess_expression函数完成,包括目标链表、WHERE语句、HAVING谓语等的处理。HAVING子句的提升或保留取决于是否包含聚集条件。删除冗余信息以优化路径生成。
生成路径的入口函数query_planner负责找到从一组基本表到最终连接表的最高效路径。路径生成算法包括动态规划与遗传算法,分别解决路径选择与状态传递问题。路径生成流程涉及make_one_rel函数,最终生成最优路径并转换为执行计划。
在得到最优路径后,优化器根据路径生成对应的执行计划。创建计划的入口函数create_plan提供顺序扫描、采样扫描、索引扫描与TID扫描等计划生成。整理计划树函数set_plan_references负责最后的细节调整,优化执行器执行效率。代价估算考虑磁盘I/O与CPU时间,根据统计信息与查询条件估计路径代价。
查询编译与规划是数据库性能的关键环节。PostgreSQL通过高效的查询分析、重写与规划,生成最优执行计划,显著提高查询执行效率。动态规划与遗传算法等优化策略的应用,确保了查询处理的高效与灵活性。
es lucene搜索及聚合流程源码分析
本文通过深入分析 TermQuery 和 GlobalOrdinalsStringTermsAggregator,旨在揭示 Elasticsearch 和 Lucene 的搜索及聚合流程。从协调节点接收到请求后,将搜索任务分配给相关索引的各个分片(shard)开始。 协调节点将请求转发至数据节点,数据节点负责查询与聚合单个分片的数据。 在数据节点中,根据请求构建 SearchContext,该上下文包含了查询(Query)和聚合(Aggregator)等关键信息。查询由请求创建,例如 TermQuery 用于文本和关键词字段,其索引结构为倒排索引;PointRangeQuery 用于数字、日期、IP 和点字段,其索引结构为 k-d tree。 构建 Aggregator 时,根据 SearchContext 创建具体聚合器,如 GlobalOrdinalsStringTermsAggregator 用于关键词字段的全局排序术语聚合。 在处理全局排序术语聚合时,如果缓存中不存在全局排序,将创建并缓存全局排序,当分片下的数据发生变化时,需要清空缓存。 全局排序将所有分段中的指定字段的所有术语排序并合并成一个全局排序,同时创建一个 OrdinalMap,用于在收集时从分段 ord 获取全局 ord。 docCounts 用于记录 ord 对应的文档计数。 对于稀疏情况下的数据收集,使用 bucketOrds 来缩减 docCounts 的大小,并通过 LongHash 将全局 ord 与 id 映射起来,收集时在 id 处累加计数。 处理聚合数据时,根据请求创建具体的权重,用于查询分片并创建评分器。查询流程涉及从 FST(Finite State Transducer,有限状态传感器)中查找术语,读取相关文件并获取文档标识符集合。 评分及收集过程中,TopScoreDocCollector 用于为文档评分并获取顶级文档。聚合流程中,GlobalOrdinalsStringTermsAggregator 统计各术语的文档计数。 协调节点最终收集各个分片的返回结果,进行聚合处理,并获取数据,数据节点从存储字段中检索结果。在整个流程中,FetchPhase 使用查询 ID 获取搜索上下文,以防止合并后旧分段被删除。 本文提供了一个基于 Elasticsearch 和 Lucene 的搜索及聚合流程的深入分析,揭示了从请求接收、分片查询、聚合处理到数据收集和结果整合的全过程。通过理解这些关键组件和流程,开发者可以更深入地掌握 Elasticsearch 和 Lucene 的工作原理,优化搜索和聚合性能。求C语言源代码 题目 学生成绩管理系统
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{ #define UP
#define DOWN
#define INSERT
#define DEL
#define ENTER
#define KEY
#define KEY
#define KEY
#define KEY
#define KEY A
#define KEY B
#define KEY C
#define KEY D
#define KEY E
#define KEY F
#define KEY G
#define KEY H
#define KEY I
#define KEY K
#define KEY L
#define KEY M
#define KEY N
#define KEY O
#define KEY P
#define KEY Q
#define KEY R
#define KEY S
#define KEY T
#define KEY U
#define KEY V
#define KEY W
#define KEY X
#define KEY Y
#define KEY Z
#define ALT F2
#define ALT F6
#define CTRL 4
#define SHIFT 1
#define ESC 1
#define BACKSPACE
#define LEN sizeof(struct student)
/*菜单选项。下拉标志*/
int menu x yes=1;
int menu y yes=0;
int menu x=1;
int menu x old=0;
int menu y1=1, menu y3=1;
/*保存文件名*/
char filename[]="NONAME.dat";
/*开辟保存数据的空间*/
void *buf=0;
int left,top,right,bottom;
/*开辟保存数据的空间*/
struct student
{ long num;
char name[];
float h maths;
float english;
float c;
float sum;
int s sum;
struct student*next;
};
struct student*head=0,*p1,*p2;
int record n;
char key buf[];
long student number=0;
char student name[];
float student score=0;
/*读键扫描码*/
char get key(void)
{ AH=0; int (0X); return( AH); }
/*显示字符*/
void show char(char z)
{ AL=z; AH=0x0e; int (0x);}
/*测试是否有键输入*/
int key pressed(void)
{ AH=0x0b; int (0x); if( AL==0) return(0); else return(1);}
/*退出程序*/
voidquit(void)
{ void free data(void);void restore menu(void); free data();
restore menu(); window(1,1,,,0x0f);
cur show(); gotoxy(1,1); exit(1);
}
/*回到dos提示符*/
void os shell(void)
{ void mainmenu show(void);
window(1,1,,,0x0f);
cur show(); gotoxy(1,1); system("");
mainmenu show();
}
/*主窗口文字*/
void main menu 1(void)
{ int i,j; char*p;
char*mainmenu word[]={ "File ","Save ","Options ","About me"};
if(menu x!=menu x old||!menu y yes)
{ p=mainmenu word[0];
putstr(4,1,0x,p,);
for(i=0;i<;i++) if(*p++<='Z') putchar(i+4,1,*(p-1),0x);
p=mianmenu word[0];
if(menu x yes)
for(i=0;j=0;i<;i++)
{ it('A'<=*p&&*(p+1)=='')break;
putchar(i+4,1,*p,0x0f); }
p++; }
}
}
void main menu 2(void)
{ int i; int len; char *p;
char*mainmenu word[6]={ "F1-Help","F2-Save","F5-OS shell","F-Menu","Message"};
void main box(void); main box();
p=mainmenu word[0]; putstr(2,,0x,p,);
for(i=0;i<;i++) { if(*p=='F'||('0'<=*p&&*p<='9'))putchar(i+2,*p,0x); p++; }
p=mainmenu word[4]; putstr(,,0x,p,9); len=strlen(filename);
putchar(-len/2-1,2,'',0x);
for(p=filename,i=0;*p!=0;p++;i++) putchar(-len/2+i,2,*p,0x);
putchar(-len/2+len,2,'',0x);
}
/*主窗口线框*/
void main box(void)
{ int i;
for(i=1;i<=;I++) { putchar(i,2,,0x); putchar(i,,,0x);putchar(i,,,0x);}
for(i=1;i<=;i++) { putchar(1,i,,0x); putchar(,i,,0x); }
putchar(1,2,,0x); putchar(,2,,0x); putchar(1,,,0x);
putchar(,,,0x); putchar(1,,,0x); putchar(,,,0x);
}
/*显示主窗口菜单*/
voidmianmenu show (void)
{ textmode set(); cur hide();
window(1,1,,,0x1e);
window(1,1,,1,0x);
window(1,,,,0x);
main menu ; main menu ;
}
/*显示下拉菜单*/
void menu show (void)
{ int i;
char*submenu word[][5]={ { "New file F4","Open file F3","OS shell F5","Quit Alt-X"},
p"Input F6","Delete F8","Update F9","query F","Sort F"}};
switch(menu x)
{ case 1:
if(menu x!=menu x old)
{ menu x old=menu x; menu window(3,2,,8); menu box(3,2,,8,3,0);}
for(i=0;i<2;i++)
{ putstr(4,3+i,0x,submenu word[0][i],);
putchar(5,3+i,*(submenu word[0][i]+1),0x); }
for(i=3;i<5;i++) putstr(4,3+i,0x7-,submenu word[0][i-1],);
putchar(6,6,*(submenu word[0][2]+2),0x);
putchar(5,7,*(submenu word[0][3]+1),0x);
window(4,2+menu y1,,2+menu y1,0x0f);
if(menu y1<=2)
putstr(4,2+menu y1,0x0f,submenu word[0][menu y1-1],);
else
putstr(4,2+menu y1,0x0f,submenu word[0][menu y1-2],); break;
case 2:menu x old=menu x; menu window(,2,,8);}
for(i=0;i<5;i++)
{ putstr(,3+i,0x,submenu word[1][i],);
putchar(,3+i,*(submenu word[1][i]+1,0x); }
window(,2+menu y3,,2+menu y3,0x0f);
putstr(,2+menu y3,0x0f,submenu word[1][menu y3-1],); break;
case 4:menu x old=menu x; }
}
/*清空键盘缓冲*/
void clr buf(void){ key buf[1]=0;}
void free data(void)
{ struct student*pa,*pb;
if(head)
{ pb=pa=head;
do{ pb=pa; pa=pb->next; free(pb);}while(pa!=0);head=0; }
}
/*姓名处理*/
int string name(void)
{ int i,j;
if(key buf[1]==0) return(0);
for(i=2,j=0;i<=key buf[1]+1;i++;j++)
student name[j]='\0'; return(1);}
/*输入数据*/
voidinput(int flag)
{ int i; char*s1="NO. Name H maths English C\\C++ ";
char*s2=" | | | | ";
char*title="INPUT"; menu window(,,,); window(,,,,0x);
putstr(,,0x,title,7); putstr(,,0x,s1,);
if(head==0)
{ head=p1=p2=(struct student*)malloc(LEN);if(!head)memory error();
p1->next=0;
else{
for(p1=head,record n=0;p1!=0;record n++)
{ p2=p1; p1=p2->next; }
p1=(struct student*)malloc(LEN);
if(!p1)memory error();
p2->next=p1; }
while(1)
{ record n++; putstr(,,0x,s2,);
if(flag==1)
{ gotoxy(,); printf("Record%d",record n); }
do{ window(,,,,0x);
if(!getstring(,,))goto out ;
}while(!getstring number());
p1->num=student number;
do{ if(!getstring(,,)) goto out;
}while(!string name());
strcpy(pi->name,student name);
for(i=1;i<=3;i++)
{ do{ window(+(i-1)*8,,0x);
if(!getstring(+(i-1)*8,,5)) gotoout;
}while(!string score());
if(i==1)p1->h maths=student score;
if(i==2)pi->english=student score;
if(i==3)p1->c=student score; }
p1->sum=0.0; p1->s num=0;
if(flag==2){ record n--;goto out;}
p2=p1;
p1=(struct student*)malloc(LEN);
if(!p1)memory error();
p1->next=0; p2->next=p1; }
out: cur hide(); window(,,,,0x1e);
if(flag==1) { if(head==p1)head=0; free(p1); p2->next=0; info(1); record n--; }
menu x yes=1; main menu 1();
}
/*查看是否有该成绩*/
struct student* search(int flag)
{ struct student8pa,*pb; if(head==0)return(0); pb=pa=head;
if(flag==1)
{ if(head->num==student number) return(head-1);
do{ if(pa->num==student number) return(pb);
pb=pa; pa=pb->next;} while(pa!=0); }
return (0);
}
/*查询,删除,修改对话框*/
struct student*msg box(int which)
{ int flag; int key; char*p="<-A B->"; menu window(,,,); gotoxy(,);
printf("Number OR Name"); window(,,,,0x); gotoxy(,);
printf(" | "); gotoxy(,);
switch(which)
{ case 1:printf("Delete");break;
case 2:printf("Update");break;
case 3:printf("Query");break; }
do{ while(!key pressed())
now time();
key=get key(); if(key==KEY A) { flag=1;break;}
if(key==KEY B) { flag=2;break;} printf("\");
}while(1);
putstr(,,0x,p,7);
if(flag==1)
{ do{
gotoxy(,); printf(" | "):
if(!getstring(,,)) goto out;
}while(!string number());
window(,,,,0x1e); return(search(1)); }
else
{ do{ gotoxy(,); printf(" | ");
if(!getstring(,,)) goto out;
}while(!string name());
window(,,,,0x1e); return(0);}
/*删除记录*/
void delete(void)
{ struct student*pa,*pb; pb=msg box(1); if(pb==0)info(3);
else
{ if(pb==(head-1))
{ pb=head; if(pb->next==0) head=0;
else head=pb->next; }
else
{ if(pb->next->next==0) { pb->next=pa; } }
record n--; info(2); }}
/*删除记录*/
void update(void)
{ int i; struct student*p; i=record n; p=msg box(2;
if(p==0)info(3);
else
{ input(2);
if(i==record n)
{ if(p==(head-1)){
head->num=p1->num; strcpy(head->name,p1->name);
head->h maths=p1->h maths; head->english=p1->english;
head->c=p1->c; free(p1); p2->next=0; }
else { p->next->num=p1->num; strcpy(p->next->name,p1->name);
p->next->h maths=p1->h maths; p->next->english=p1->english;
p->next->c=p1->c; free(p1); p2->next=0; }
info(4); }
else { record n--;p2->next=0;free(p1);info(5);} }}
/*查询成绩*/
void query(void)
{ struct student*p,*pa,*pb; int key ,flag,i,j;
char*str="NO. Name H matns English C\\C++ Sum S NO.";
char*sm="NO. Name h maths English C\\C++ (who fails)";
menu window(,,,); gotoxy(,); printf("Find Fail");
putchar(,,'A',0xe4); putchar(,,'B',0xe4);
do{ if(!key pressed()) now time();
key=get key();
if(key==KEY A){ flag=1;break;}
if(key==KEY B){ flag=2;break;}
printf("\"); }while(1);
window(,,,,0x1e); if(flag==1)
{ p=msg box(3); if(p==0) info(3);
else{ window(6,5,,,0x0e); window(5,4,,,0x5e); window(6,5,,,0x0e);
putstr(,4,0x5a,str,); gotoxy(6,6);
if(p!=(head-1)){ pa=p->next;p=pa;}
else p=head;
printf("%d%s%8.1f%9.1f%9.1f%9.1f%6d\n",\
p->num,p->name,p->h maths,p->english,p->c,p->sum,p->s sum);
}}
if(flag==2)
{ window(6,5,,,0x0e);window(5,4,,,0x5e); window(6,5,,,0x0e);
putchar(,4,0x5a,sm,); if(head)
{ pa=head; j=0;
do{ j++; i=0; window(6,5,,,0x0e); gotoxy(,);
printf("Page%d",j);
do
{ if(pa->c<||pa->h maths<||pa->english<)
{ gotoxy(6,6+i); i++;
printf("%d%s%8.1f%9.1f%9.1f%9.1f%6d\n",\
p->num,p->name,p->h maths,p->english,p->c,p->sum,p->s sum);}
pb=pa; pa=pb->next; }while(i!=&&pa!=0);
while(!key pressed()) now time();
get key(); }while(pa!=0);
goto out;}}
while(!key pressed())
now time();get key();
out:window(5,4,,,0x1e);}
/*成绩排名*/
void sort(void)
{ int i,j,n,flag; struct student*pa=0,*pb=0;
struct student*p[],*pmin;
char*str="NO. Name H maths English C\\C++ Sum S NO.";
window(6,5,,,0x0e); window(5,4,,,0x5e); window(6,5,,,0x0e);
putstr(,4,0x5a,str,); window(,,,,0x5b);
if(head!=0)
{ i=0; pb=pa=head;
do
{ p[i]=pa; i++; pa->sum=pa->h maths+pa->english+pa->c;
pb=pa; pa=pb->next; }while(pa!=0);
for(n=record n-1,i=0;i<n;i++)
{ flag=0;
for(j=0;j<n-i;j++)
if(p[j]->sum<p[j+1]->sum)
{ pmin=p[j]; p[j]=p[j+1]; p[j+1]=pmin; flag=1; }
if(flag==0)break; }
head=pb=pa=p[0]; head->s sum=1;
if(record n>1)
for(i=1;i<record n;i++) { pa->s sum=i; pb=pa; pa=pb->next=p[i];}
p2=p1=p[record n-1]; p1->s sum=record n;
p1->next=0; pb=pa=head;
j=0;
do{
j++;i=0; window(6,5,,,0x0e); gotoxy(,); printf("Page%d",j);
do
{ gotoxy(6,6+i); i++;
printf("%d%s%8.1f%9.1f%9.1f%9.1f%6d\n",\
p->num,p->name,p->h maths,p->english,p->c,p->sum,p->s sum);}
pb=pa; pa=pb->next; }while(i!=&&pa!=0);
while(!key pressed()) now time();
get key(); }while(pa!=0);
goto out;}
while(!key pressed())
now time();get key();
out:window(5,4,,,0x1e);}
/*输入文件名*/
int input filename(int m)
{ char*p; int fp; menu window(,,,);
window(,,,,0x);
gotoxy(,); printf("File name");
if(!getstring(,,)) goto no;
if(key buf[1]==0) goto no;
p=key buf+2; key buf[key buf[1]+2]='\0';
if(fp=fopen(p,"rb+"))==0)
{ if(m==2) goto no; if(fp=fopen(p,"wb+"))==0 goto no; }
fclose(fp); strcpy(filename,p);
yes: window(,,,,0x1e);
return(1);
no: window(,,,,0x1e);
return(0);
}
/*新建文件*/
void new file(void)
{ int fp;
if(input filename(1)==0) info(9;
else
{ main menu 2(); free data(); fp=fopen(filename,"wb+"); fclose(fp); info(); }
}
/*打开文件*/
void open file(void)
{ struct student*pa,*pb; int fp;
if(input filename(2)==0)info(6);
else
{ free data(); head=pb=pa=(struct student*)malloc(LEN); fp=fopen(filename,"rb+";
fread(&pa->num,LEN,1,fp);}
info(8); fclose(fp); input(1); }}
/*保存文件*/
void save fiel(void)
{ struct student8pa,*pb; int fp;
if((fp=fopen(filename,"rb+"))==0) fp=fopen(filename,"wb+");
pb=pa=head;
if(fp!=0&&head!=0)
{ do{ fwrite(&pa->num,LEN,1,fp); pb=pa; pa=pb->next;}while(pa!=0);
fclose(fp); }
info(7);
}
void about me(void)
{ int i; char*title="About Me"; char*str[]={ " I'M A BIG.BIG WORLD. "};
menu window(,5,,); putstr(,5,0x,title,);
for(i=0;i<;i++)putstr(,6+i,0x,str[i],);
while(!key pressed()) now time();
get key(); window(,5,,,0x1e);
}
system("PAUSE");
return EXIT_SUCCESS;
}
七爪源码:如何使用 Java 访问 BigQuery 数据仓库
在本文中,我们将深入探讨如何利用Java应用程序通过BigQuery Java SDK访问数据仓库。
首先,要访问BigQuery,你需要进行一些基本的配置。这包括设置BigQuery的权限,确保你的Java应用具有足够的访问权限以执行查询操作。
接下来,初始化一个BigQuery对象是关键步骤。这涉及到引入SDK库,设置连接参数,并创建一个代表查询的实例。
以下是一段实际的代码示例,展示了如何执行查询:
java
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.QueryJob;
import com.google.cloud.bigquery.QueryJobConfiguration;
// 初始化BigQuery对象
BigQuery bigQuery = BigQueryOptions.getDefaultInstance().getService();
// 设置查询配置
QueryJobConfiguration queryConfig = QueryJobConfiguration.newBuilder("YOUR_QUERY_HERE")
.build();
// 执行查询
QueryJob queryJob = bigQuery.query(queryConfig);
queryJob.run();
这段代码可以作为一个模板,你可以从用户界面(UI)接收查询参数,然后执行并返回查询结果给UI。
MMDet——DETR源码解读
DETR,作为目标检测领域的里程碑式工作,首次全面采用Transformer架构,实现了端到端的目标检测任务,堪称Transformer在该领域的开创之作。其核心创新在于引入了object query,将目标信息以查询形式输入Transformer的解码器。object query首先通过自注意力机制学习对象特征,确保每个query关注独特的对象信息。接着,它与经过自注意力处理的图像特征进行交叉注意力,提取目标特征,最终得到包含对象信息的query,通过全连接层(FFN)输出bbox和类别信息。 深入理解DETR前,首先要明确两个关键点:一是模型结构原理,二是MMDet配置解读。DETR模型主要包括Backbone(如ResNet,常规但非重点)、Transformer的编码器和解码器、以及head部分。在MMDet配置文件中,model部分区分了Backbone和bbox_head。 在MMDet的单阶段目标检测训练中,forward_single()函数在mmdet/models/dense_heads/detr_head.py中负责除Backbone外的前向计算,代码展示有助于理解。DETR的前向过程涉及的主要变量形状可以参考代码中的打印,但需注意由于随机裁剪,不同batch的形状可能会有所变化。 Transformer部分在mmdet/models/utils/transformer.py中,N代表特征图的宽度和高度的乘积,这里提供了详细的代码解读。若对Transformer的mask有疑问,可以参考相关文章深入理解。