无法读出 已持久化的 流表数据

我的流表 实际接收了 超800万条的数据, 可目前能看见的 只有 700万条。

在 dolphindb.cfg (单服务器,单节点)中配置如下:

#发布节点配置
maxPubConnections=20
persistenceDir=C:/DevTools/DolphinDB/Data/Streaming
persistenceWorkerNum=1
maxPersistenceQueueDepth=10000000
maxMsgNumPerBlock=1024
maxPubQueueDepthPerSite=10000000

startup=C:/DevTools/DolphinDB/startup.dos

#订阅节点配置
subPort=10777
subExecutors=0
maxSubConnections=64
subExecutorPooling=false
maxSubQueueDepth=10000000
在 startup.dos 中内容如下:
login(`admin, `123456);

////////  ticks 表
/////// 表的 各 列 和 数据类型, 并建一张空表
tbColNames=
`TradingDay`InstrumentID`ExchangeID`ExchangeInstID`LastPrice`Volume`Amount`OpenPosition`PreSettlementPrice`PreClosePrice`PreOpenInterest`OpenPrice`HighestPrice`LowestPrice`TotalVolume`TotalTurnover`OpenInterest`ClosePrice`SettlementPrice`UpperLimitPrice`LowerLimitPrice`ActionTime`RecvTime`BidPrice1`BidVolume1`AskPrice1`AskVolume1`BidPrice2`BidVolume2`AskPrice2`AskVolume2`BidPrice3`BidVolume3`AskPrice3`AskVolume3`BidPrice4`BidVolume4`AskPrice4`AskVolume4`BidPrice5`BidVolume5`AskPrice5`AskVolume5`AveragePrice`PreDelta`CurrDelta`RecordNo`TotalRecordNo`InDbTime 
tbColTypes=[DATE,SYMBOL,SYMBOL,SYMBOL,DOUBLE,INT,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,INT,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,TIMESTAMP, TIMESTAMP,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,DOUBLE,DOUBLE,INT,INT,TIMESTAMP] ;

///////// 建空表
tbTicks = streamTable(100000:0,tbColNames,tbColTypes) ;

//////////  设定流数据表 (tbTicks) 可持久化 并 共享
enableTableShareAndPersistence(table=tbTicks, tableName=`ticks, cacheSize=7000000, retentionMinutes=4320 )
在GUI操作台上,执行如下操作
login(`admin, `123456)

///////////  查看共享表 (ticks)
count(ticks) 	/// 输出结果: 7013355

////// 订阅表
////// 表的 各 列 和 数据类型, 并建一张空表
tbColNames=
`TradingDay`InstrumentID`ExchangeID`ExchangeInstID`LastPrice`Volume`Amount`OpenPosition`PreSettlementPrice`PreClosePrice`PreOpenInterest`OpenPrice`HighestPrice`LowestPrice`TotalVolume`TotalTurnover`OpenInterest`ClosePrice`SettlementPrice`UpperLimitPrice`LowerLimitPrice`ActionTime`RecvTime`BidPrice1`BidVolume1`AskPrice1`AskVolume1`BidPrice2`BidVolume2`AskPrice2`AskVolume2`BidPrice3`BidVolume3`AskPrice3`AskVolume3`BidPrice4`BidVolume4`AskPrice4`AskVolume4`BidPrice5`BidVolume5`AskPrice5`AskVolume5`AveragePrice`PreDelta`CurrDelta`RecordNo`TotalRecordNo`InDbTime
tbColTypes=[DATE,SYMBOL,SYMBOL,SYMBOL,DOUBLE,INT,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,INT,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,DOUBLE,TIMESTAMP, TIMESTAMP,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,INT,DOUBLE,DOUBLE,DOUBLE,INT,INT,TIMESTAMP]
///////// 建空表
share streamTable(10000:0,tbColNames,tbColTypes) as subTb1
/////////////  订阅 本节点 表
topic1 = subscribeTable(, `ticks, `action_View_01, -1, subTb1, true)
topic1 	///  输出结果: localhost:8848:local8848/ticks/action_View_01

count(subTb1) 	///  输出结果: 0

getStreamingStat().pubTables //查看发布表 
//////  输出结果:  
//////  	tableName, subscriber,      msgOffset, actions
//////  	ticks,     localhost:10777, 8651755,   action_View_01

getStreamingStat().pubConns //发布链接情况
//////  输出结果:  
//////  	client,          queDepthLimit, queueDepth, tables
//////  	localhost:10777, 10000000,      0,          ticks

getStreamingStat().subWorkers //查询订阅状态
//////  没有有效数据

getStreamingStat().subConns   //订阅链接数 
//////  没有有效数据
我想要读取 已经被持久化的 100万条记录,该怎么办?
还是我上述的操作有什么问题?
谢谢
请先 登录 后评论

2 个回答

Boye

已经持久化的表数据不能直接用sql查询。 可以通过指定offset的方式subscribeTable,可以订阅到已经持久化的内容。通常的用法是,把流表订阅到分布式表,数据分析查询分布式表。

offset可通过getPersistenceMeta函数获取,其中diskOffset记录了当前磁盘上数据相对总记录数的偏移量。


请先 登录 后评论
Jason Tang - 时序数据库技术支持

(1)首先回答为什么流数据表接收了800多W条数据,但是这个持久化流表中只显示700W条

您这边定义持久化流表的语句如下:

enableTableShareAndPersistence(table=tbTicks, tableName=`ticks, cacheSize=7000000, retentionMinutes=4320 )

cacheSize参数是指该流表内存中保存的最大记录条数,您设置的是700W,所以每当该流表到达700W条后,就会把最早的350W条记录从内存中清除,继续接收最新记录的写入,所以该流表会始终将内存中的记录条数控制在小于等于700W条这样的水平,有时候可能会超过700W条,这取决于最后一个批次写入的记录条数,比如最后一批数追加到该表中正好为701W条,那么该表会显示701W条记录,随后就会从内存中移除一半的记录条数,然后继续追加最新的数据。

(2)设置持久化流表的目的有三个:一是控制持久化流表在内存中的记录数;二是当发布节点异常关闭重启时,可以从持久化目录加载部分最新记录的持久化数据到内存,供消费节点重连接后继续消费,保证有且仅消费一次的目的;三是供订阅者可以订阅该持久化流数据表中已经不在内存中的但持久化在磁盘上的数据。

综上,您这边如果想去查看已经不在内存表但是还在持久化磁盘中的数据,可以通过再次去订阅这个持久化流表,设置需要查看记录的正确offest即可。


请先 登录 后评论
  • 2 关注
  • 0 收藏,1045 浏览
  • MrJin 提出于 2021-09-26 09:10

相似问题