createIPCInMemoryTable
语法
createIPCInMemoryTable(size, tableName, columnNames,
columnTypes)
参数
size 整数,表示 table 能缓存的记录数。该值必须大于 1,000,000,否则系统自动取 1,000,000。
tableName 字符串,表示跨进程共享内存表的名称。
columnNames 字符串向量,用于指定表的列名。
columnTypes 向量,表示每列的数据类型。可使用表示数据类型的系统保留字或相应的字符串。
详情
创建一个跨进程共享内存表的句柄。跨进程共享内存表通常作为流计算的输出表。在对时延要求极高的场景下,用户进程通过插件直接访问共享内存获取数据,极大减小了 TCP 等网络传输的时延。
跨进程共享内存表通过共享内存(由操作系统管理)进行跨进程通信。共享内存表仅支持在同一物理机内共享,不支持在集群不同物理节点间进行共享。
跨进程共享内存表支持读写,但不支持对跨进程共享内存表的表结构进行修改。向跨进程共享内存表写数据的方法,与普通内存表一致。若一次性插入的数据量大于共享内存,系统会抛出异常。
-
读写机制:将写入共享内存的进程作为生产者,从共享内存中读取数据的进程作为消费者。一次写入的数据将作为一个整体,供一次读取消费,且读进程依次按顺序对写入的数据进行消费。例如:第一写入 100 条数据,第二次写入 200 条数据,则第一次会读到 100 条数据,第二次会读到第二批写入的 200 条数据,以此类推。读取数据时,共享内存表中的所有数据均已被消费,则读进程会被阻塞,直到有新写入的可消费数据时,才能将数据读出。
DolphinDB 支持多进程并发写入共享内存表,以及在写入的同时进行读操作。但注意,只能同时存在一个读进程。参考上述读写机制,读取是一次性的,若不同进程并发读取,将会得到不同阶段写入的数据。
例子
创建一个跨进程共享内存表,并作为流数据订阅的输出表。
share streamTable(10000:0,`timestamp`temperature, [TIMESTAMP,DOUBLE]) as pubTable
ipc_t = createIPCInMemoryTable(1000000, "ipc_table", `timestamp`temperature, [TIMESTAMP, DOUBLE])
def shm_append(mutable table, msg) {
table.append!(msg)
}
subscribeTable(tableName="pubTable", actionName="act3", offset=0, handler=shm_append{ipc_t}, msgAsTable=true)
// 写入数据
n = 200
timestamp = 2022.01.01T09:00:00.000 + 1..n
temp = 30 + rand(5.0,n)
tableInsert(pubTable,timestamp,temp)