From 30dbe9aa5c792e3d6fe61272644741c845343b3b Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Wed, 10 Jul 2024 15:08:49 +0100 Subject: [PATCH 01/40] removed info on chained tp/rdb, updated info --- docs/architecture/index.md | 6 +-- docs/basics/glossary.md | 2 +- docs/kb/chained-tickerplant.md | 51 ---------------------- docs/kb/kdb-tick.md | 78 ++++++++++++++++++++++++++-------- docs/wp/tick-profiling.md | 4 +- mkdocs.yml | 5 +-- 6 files changed, 68 insertions(+), 78 deletions(-) delete mode 100644 docs/kb/chained-tickerplant.md diff --git a/docs/architecture/index.md b/docs/architecture/index.md index 4cf4724d1..eaac7fa8a 100644 --- a/docs/architecture/index.md +++ b/docs/architecture/index.md @@ -1,13 +1,11 @@ --- title: Architecture | Documentation for q and kdb+ description: How to construct systems from kdb+ processes +keywords: hdb, kdb+, q, rdb, tick, tickerplant, streaming --- # Architecture of kdb+ systems - - - _Applications that use kdb+ typically comprise multiple processes_ ![architecture](../img/architecture.png) @@ -46,7 +44,7 @@ Handles end-of-day (EOD) processing. For best resilience, and to avoid core resource competition, run them on their own cores. -## Log file +### Log file This is the file to which the Tickerplant logs the q messages it receives from the feedhandler. It is used for recovery: if the RDB has to restart, the log file is replayed to return to the current state. diff --git a/docs/basics/glossary.md b/docs/basics/glossary.md index 28f78a054..f27bc428b 100644 --- a/docs/basics/glossary.md +++ b/docs/basics/glossary.md @@ -102,7 +102,7 @@ Applying a value to its argument/s or indexes by writing it to the left of an ar ## Chained tickerplant -A [chained tickerplant](../kb/chained-tickerplant.md) subscribes to the master tickerplant and receives updates like any other subscriber, and then serves that data to its subscribers in turn. +A [chained tickerplant](../kb/kdb-tick.md#chained-tickerplants) subscribes to the master tickerplant and receives updates like any other subscriber, and then serves that data to its subscribers in turn. ## Character constant diff --git a/docs/kb/chained-tickerplant.md b/docs/kb/chained-tickerplant.md deleted file mode 100644 index df2d5dbd8..000000000 --- a/docs/kb/chained-tickerplant.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: Chained tickerplant and RDB for kdb+tick – Knowledge Base – kdb+ and q documentation -description: Two scripts provide convenient additional functionality to an existing kdb+tick setup. -author: Simon Garland -keywords: chained, kdb+, q, rdb, tickerplant ---- -# Chained tickerplant and RDB for kdb+tick - - - - -Two scripts provide convenient additional functionality to an existing kdb+tick setup. - - -## Chained tickerplant - -There are a number of occasions when an additional tickerplant would be useful – but it’s overkill to have a full parallel installation. A chained tickerplant subscribes to the primary tickerplant and receives updates like any other subscriber, and then serves that data to its subscribers in turn. Unlike the primary tickerplant, it doesn’t keep its own log. - -If the primary tickerplant is a zero-latency tickerplant the chained tickerplant can be a more traditional tickerplant that chunks up updates on a timer. For example if clients are using data from the tickerplant to drive a GUI it’s pointless having that updated every time a new tick comes in – probably a tickerplant that updates once a second would suffice. - -Having a second tickerplant allows keeping ordinary users safely away from the primary tickerplant – the primary tickerplant can be set up to allow only specific connections – and all other subscribers would have to go to the chained tickerplant. - -Start a chained tickerplant from port 5010 with bulk updates. - -```bash -$ q chainedtick.q :5010 -p 5110 -t 1000 -``` - -Start a chained tickerplant which echoes updates immediately. -```bash -$ q chainedtick.q :5010 -p 5110 -t 0 -``` - -:fontawesome-brands-github: -[KxSystems/kdb/tick/chainedtick.q](https://github.com/KxSystems/kdb/blob/master/tick/chainedtick.q) - - -## Chained RDB - -A chained RDB can either be connected to the primary tickerplant, or to a chained tickerplant. Unlike a default RDB, the chained RDB doesn't have any day-end processing beyond emptying all tables. - -The benefit is similar to that of a chained tickerplant – being able to keep ordinary users away from the primary RDB. In particular, if connecting to a chained bulking tickerplant instead of a primary zero latency tickerplant the CPU load will be lower. - -Don’t forget though that a second RDB will double up the memory usage – it's an in-memory database and can’t be sharing any data with the primary RDB. - -```bash -$ q chainedr.q :5010 -p 5111 / start a chained RDB from :5010 -``` - -:fontawesome-brands-github: [KxSystems/kdb/tick/chainedr.q](https://github.com/KxSystems/kdb/blob/master/tick/chainedr.q) - diff --git a/docs/kb/kdb-tick.md b/docs/kb/kdb-tick.md index cc9522587..8c599d9d4 100644 --- a/docs/kb/kdb-tick.md +++ b/docs/kb/kdb-tick.md @@ -1,45 +1,89 @@ --- -title: kdb+tick configuration – Knowledge Base – kdb+ and q documentation +title: kdb+tick alternative architecture – Knowledge Base – kdb+ and q documentation description: A ‘vanilla’ tick setup has a tickerplant (TP) logging to disk and publishing to an in-memory realtime database (RDB) – and at day-end the RDB data is saved to disk as another day in the history database (HDB). Users typically query the RDB or HDB directly. It doesn’t have to be that way. There are a many other ways of assembling the kdb+tick “building blocks” to reduce or share the load. keywords: chained, hdb, kdb+, q, rdb, tick, tickerplant --- -# kdb+tick configuration +# kdb+tick alternative architecture - - - -A ‘vanilla’ tick setup has a tickerplant (TP) logging to disk and publishing to an in-memory realtime database (RDB) – and at day-end the RDB data is saved to disk as another day in the history database (HDB). Users typically query the RDB or HDB directly. +A [‘vanilla’](../architecture/index.md) tick setup has a tickerplant (TP) logging to disk and publishing to an in-memory realtime database (RDB) – and at day-end the RDB data is saved to disk as another day in the history database (HDB). Users typically query the RDB or HDB directly. It doesn’t have to be that way. There are a _many_ other ways of assembling the kdb+tick “building blocks” to reduce or share the load. ## Chained tickerplants -Starting at the beginning with the TP: if this is running in zero-latency mode (i.e. all updates are published immediately to subscribers) it is completely over-the-top to have a client task that is only plotting graphs subscribe for instantaneous update – an update every few seconds would be quite adequate. +If the primary tickerplant is running in zero-latency mode (i.e. all updates are published immediately to subscribers) +it can be inefficient to have a client task that is only plotting graphs subscribe for instantaneous update. An update every few seconds would be quite adequate. -One way of doing this is to have a chained TP, or even a chain of them. The first TP would be a zero-latency TP – and would have only clients who truly need immediate update. It in turn would have as one of its clients a TP publishing bulk updates every 100ms. That in turn would have a chained tickerplant as client that publishes updates only every second. Clients then subscribe to the TP with granularity that suits their needs. +One way of doing this is to have a chained tickerplant, or even a chain of them. -:fontawesome-regular-hand-point-right: -[Chained tickerplant and RDB for kdb+tick](chained-tickerplant.md) +A chained tickerplant subscribes to the primary tickerplant and receives updates like any other subscriber, and then serves that data to its subscribers in turn. +Unlike the primary tickerplant, *it doesn’t keep its own log*. +If the primary tickerplant is a zero-latency tickerplant the chained tickerplant can be a more traditional tickerplant that chunks up updates on a timer. +For example if clients are using data from the tickerplant to drive a GUI, it may not need updates hundreds of times per second. +A tickerplant that updates once a second would suffice -## No RDB +### Example -Next in the chain comes the RDB. An RDB is an in-memory database, and by day-end can be using a lot of memory. If clients are querying that data intra-day then the memory cost is reasonable – but if the data’s only being collected for insertion into the HDB at day-end the overhead is unreasonable. In such a case it would make sense to write the data to disk during the day so that it’s ready for day-end processing, but with only a small memory footprint to build bulk updates. +The example script [`chainedtick.q`](https://github.com/KxSystems/kdb/blob/master/tick/chainedtick.q) can be run as follows: +```bash +q chainedtick.q [host]:port[:usr:pwd] [-p 5110] [-t N] +``` -:fontawesome-regular-hand-point-right: -[Write-only alternative to RDB](w-q.md) +!!! note + chainedtick.q contains `\l tick/u.q` therefore has a dependancy on [`u.q`](https://github.com/KxSystems/kdb-tick/blob/master/tick/u.q) existing within the directory `tick`. + +If the primary tickerplant is running on the same host (port 5010), the following starts a chained tickerplant on port 5010 sending bulk updates, every 1000 milliseconds. +```bash +$ q chainedtick.q :5010 -p 5110 -t 1000 +``` +Start a chained tickerplant which echoes updates immediately. +```bash +q chainedtick.q :5010 -p 5110 -t 0 +``` + +:fontawesome-brands-github: +[KxSystems/kdb/tick/chainedtick.q](https://github.com/KxSystems/kdb/blob/master/tick/chainedtick.q) +
+:fontawesome-brands-github: +[KxSystems/kdb-tick/tick/u.q](https://github.com/KxSystems/kdb-tick/blob/master/tick/u.q) ## Chained RDBs -The other extreme is when one RDB isn’t enough - then the same approach can be used with multiple chained RDBs. Depending on the sort of clients it has it may be enough for one of the chained RDBs to subscribe to a bulk-update TP rather than the fastest zero-latency one. +A chained RDB can either be connected to the primary tickerplant, or to a chained tickerplant. +Unlike a default RDB, the chained RDB doesn't have any day-end processing beyond emptying all tables. + +The benefit is similar to that of a chained tickerplant i.e. being able to keep ordinary users away from the primary RDB. +In particular, the CPU load will reduce if connecting to a chained bulking tickerplant instead of a primary zero latency tickerplant. -A chained RDB doesn’t have to subscribe to the whole ‘firehose’. It might be useful to have a TP with only the stocks building a particular index, or perhaps only trades and no quotes. +A chained RDB doesn’t have to subscribe to the whole set of available data. +It might be useful to have an RDB with only the stocks building a particular index, or perhaps only trades and no quotes. + +Don’t forget though that a second RDB will increase the memory usage, as it's an in-memory database and can’t be sharing any data with the primary RDB. + +### Example + +The example script [`chainedr.q`](https://github.com/KxSystems/kdb/blob/master/tick/chainedr.q) can be run as follows: +```bash +q chainedr.q [host]:port[:usr:pwd] [-p 5111] +``` + +If a tickerplant is running on the same host (port 5010), the following starts a chained RDB on port 5111 +```q +$ q chainedr.q :5010 -p 5111 +``` + +:fontawesome-brands-github: [KxSystems/kdb/tick/chainedr.q](https://github.com/KxSystems/kdb/blob/master/tick/chainedr.q) + +## No RDB + +An RDB is an in-memory database, and by day-end can be using a lot of memory. If clients are querying that data intra-day then the memory cost is reasonable – but if the data’s only being collected for insertion into the HDB at day-end the overhead is unreasonable. In such a case it would make sense to write the data to disk during the day so that it’s ready for day-end processing, but with only a small memory footprint to build bulk updates. :fontawesome-regular-hand-point-right: -[Chained tickerplant and RDB for kdb+tick](chained-tickerplant.md) +[Write-only alternative to RDB](w-q.md) ## Working with the TP logfile diff --git a/docs/wp/tick-profiling.md b/docs/wp/tick-profiling.md index 2518f797a..35672c5fa 100644 --- a/docs/wp/tick-profiling.md +++ b/docs/wp/tick-profiling.md @@ -392,7 +392,7 @@ We can see that increasing the number of subscribers increases the tickerplant p If there are multiple subscribers to a tickerplant it might be worth considering a chained tickerplant to reduce the number of subscribers. Only the chained tickerplant and the subscribers which need the data as quickly as possible would subscribe to the main tickerplant. Then other subscribers would subscribe to the chained tickerplant to get the data. :fontawesome-regular-hand-point-right: -Knowledge Base: [Chained tickerplant](../kb/chained-tickerplant.md) +[Chained tickerplant](../kb/kdb-tick.md#chained-tickerplants) ## Conclusion @@ -407,7 +407,7 @@ This white paper examined some key factors which can influence the performance a - **Publish frequency** Buffering the messages in the tickerplant and publishing on a timer improves throughput. The CPU usage of the RDB also decreases as the data is being batched up into fewer updates per second. However, it is not suitable if the subscribers need the data immediately. Writing the messages to disk on a timer improves throughput further but more data could be lost if the tickerplant dies. The improvement is more noticeable as the number of updates per second increases. -- **Number of subscribers** Adding more subscribers increases the load on the tickerplant. To reduce this, consider using a [chained tickerplant](../kb/chained-tickerplant.md). Even existing subscribers will be affected if more subscribers are added since the internal message queues for each subscriber are all written to before the queues are flushed. +- **Number of subscribers** Adding more subscribers increases the load on the tickerplant. To reduce this, consider using a [chained tickerplant](../kb/kdb-tick.md#chained-tickerplants). Even existing subscribers will be affected if more subscribers are added since the internal message queues for each subscriber are all written to before the queues are flushed. These are not the only factors that contribute to a tickerplant’s performance. A complete analysis would also examine the effects that network latency and bandwidth, disk write-speed and TCP/IP tuning have on tickerplant performance. diff --git a/mkdocs.yml b/mkdocs.yml index 390f9b71e..24d39fa22 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -525,14 +525,13 @@ nav: - Developer tools: devtools.md - FAQ: kb/faq-listbox.md - Architecture: - - About: architecture/index.md + - General architecture: architecture/index.md + - Alternative architecture: kb/kdb-tick.md - Alternative in-memory layouts: kb/alternative-in-memory-layouts.md - - Chained tickerplant: kb/chained-tickerplant.md - Corporate actions: kb/corporate-actions.md - Data recovery for kdb+tick: wp/data-recovery.md - Disaster recovery: wp/disaster-recovery/index.md - Gateway design: wp/gateway-design/index.md - - kdb+tick configuration: kb/kdb-tick.md - kdb+tick profiling: wp/tick-profiling.md - Kubernetes: 'https://youtu.be/jqtkkCqBvr4' - Load balancing: kb/load-balancing.md From 325e5a73ca4752de7dd2ff0b1196daf3164ca604 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Wed, 10 Jul 2024 17:59:13 +0100 Subject: [PATCH 02/40] removed dup info on write-only rdb --- docs/kb/kdb-tick.md | 36 ++++++++++++++++++++++++++++++++---- docs/kb/w-q.md | 36 ------------------------------------ mkdocs.yml | 1 - 3 files changed, 32 insertions(+), 41 deletions(-) delete mode 100644 docs/kb/w-q.md diff --git a/docs/kb/kdb-tick.md b/docs/kb/kdb-tick.md index 8c599d9d4..cb3ea3185 100644 --- a/docs/kb/kdb-tick.md +++ b/docs/kb/kdb-tick.md @@ -78,12 +78,40 @@ $ q chainedr.q :5010 -p 5111 :fontawesome-brands-github: [KxSystems/kdb/tick/chainedr.q](https://github.com/KxSystems/kdb/blob/master/tick/chainedr.q) -## No RDB +## Write-only RDB -An RDB is an in-memory database, and by day-end can be using a lot of memory. If clients are querying that data intra-day then the memory cost is reasonable – but if the data’s only being collected for insertion into the HDB at day-end the overhead is unreasonable. In such a case it would make sense to write the data to disk during the day so that it’s ready for day-end processing, but with only a small memory footprint to build bulk updates. +The default behavior of the RDB is to collect data to an in-memory database during the day and then to save it to disk as an historical partition at day end. +This makes sense if it’s actually queried during the day, but if the only reason for having an RDB is to be able to save the historical partition +the amount of memory required to keep the in-memory database can be excessive. -:fontawesome-regular-hand-point-right: -[Write-only alternative to RDB](w-q.md) +It would make sense to write the data to disk during the day so that it’s ready for day-end processing, but with only a small memory footprint to build bulk updates. + +:fontawesome-brands-github: +[simongarland/tick/w.q](https://github.com/simongarland/tick/blob/master/w.q) +is a potential replacement for the default RDB +:fontawesome-brands-github: +[KxSystems/kdb-tick/tick/r.q](https://github.com/KxSystems/kdb-tick/blob/master/tick/r.q). + +`w.q` connects to the tickerplant just like `r.q`, but it buffers up requests and, every `MAXROWS` records, writes the data to disk. +At day end, remaining data is flushed to disk, the database is sorted (on disk) and then moved to the appropriate date partition within the historical database. + +Note that it makes no sense to query the task running `w.q` as it will have a small (and variable-sized) selection of records. +Although it wouldn’t be difficult to modify it to keep say the last 5 minutes of data, +that sort of custom collection is probably better housed in a task running a [`c.q`](#cq)-like aggregation. + +Syntax: +```bash +q w.q [tickerplanthost]:port[:usr:pwd] [hdbhost]:port[:usr:pwd] [-koe|keeponexit] +``` + +e.g. +```bash +$ q w.q :5010 :5012 +``` + +The `-koe` or `-keeponexit` parameter governs the behavior when a `w.q` task is exited at user request i.e. `.z.exit` is called. +By default the data saved so far is deleted, as if the task were restarted it would be difficult to ensure it restarted from exactly the right place. +It’s easier to replay the log and (re)write the data. If the flag is provided (or the `KEEPONEXIT` global set to `1b`) the data will not be removed. ## Working with the TP logfile diff --git a/docs/kb/w-q.md b/docs/kb/w-q.md deleted file mode 100644 index 41ddc761d..000000000 --- a/docs/kb/w-q.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Write-only RDB – Knowledge Base – kdb+ and q documentation -description: The default behavior of the RDB is to collect data to an in-memory database during the day and then to save it to disk as an historical partition at day end. This makes sense if it’s actually queried during the day – but if the only reason for having an RDB is to be able to save the historical partition the amount of memory required to keep the in-memory database can be excessive. -keywords: kdb+, q, rdb, write-only ---- -# Write-only RDB - - - - - -The default behavior of the RDB is to collect data to an in-memory database during the day and then to save it to disk as an historical partition at day end. This makes sense if it’s actually queried during the day – but if the only reason for having an RDB is to be able to save the historical partition the amount of memory required to keep the in-memory database can be excessive. - -:fontawesome-brands-github: -[simongarland/tick/w.q](https://github.com/simongarland/tick/blob/master/w.q) -is a potential replacement for the default RDB -:fontawesome-brands-github: -[KxSystems/kdb/tick](https://github.com/KxSystems/kdb/tree/master/tick). - -`w.q` connects to the tickerplant just like `r.q`, but it buffers up requests and, every `MAXROWS` records, writes the data to disk. At day end, remaining data is flushed to disk, the database is sorted (on disk) and then moved to the appropriate date partition within the historical database. - -Note that it makes no sense to query the task running `w.q` as it will have a small (and variable-sized) selection of records. Although it wouldn’t be difficult to modify it to keep say the last 5 minutes of data, that sort of custom collection is probably better housed in a task running a `c.q`-like aggregation. - -Syntax: - -```txt -q tick/w.q [tickerplanthost]:port[:usr:pwd] [hdbhost]:port[:usr:pwd] [-koe|keeponexit] -``` - -e.g. - -```bash -$ q tick/w.q :5010 :5012 -``` - -The `-koe` or `-keeponexit` parameter governs the behavior when a `w.q` task is exited at user request – i.e. `.z.exit` is called. By default the data saved so far is deleted, as if the task were restarted it would be difficult to ensure it restarted from exactly the right place – it’s easier to replay the log and (re)write the data. If the flag is provided – or the `KEEPONEXIT` global set to `1b` – the data will not be removed. diff --git a/mkdocs.yml b/mkdocs.yml index 24d39fa22..e709ec46a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -539,7 +539,6 @@ nav: - Publish and subscribe: kb/publish-subscribe.md - Query Routing: wp/query-routing/index.md - Real-time tick subscribers: wp/rt-tick/index.md - - Write-only RDB: kb/w-q.md - Advanced: - Distributed systems: wp/query-interface.md - Intraday writedown: wp/intraday-writedown/index.md From 5fc1555d97c75e60e64af65c8c68b37922d6521e Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Thu, 11 Jul 2024 10:01:01 +0100 Subject: [PATCH 03/40] improved intraday-writedown (added sections/links) --- docs/kb/kdb-tick.md | 3 +++ docs/wp/intraday-writedown/img/figure01.png | Bin 41347 -> 0 bytes docs/wp/intraday-writedown/index.md | 24 ++++++++------------ 3 files changed, 12 insertions(+), 15 deletions(-) delete mode 100644 docs/wp/intraday-writedown/img/figure01.png diff --git a/docs/kb/kdb-tick.md b/docs/kb/kdb-tick.md index cb3ea3185..089f615ef 100644 --- a/docs/kb/kdb-tick.md +++ b/docs/kb/kdb-tick.md @@ -113,6 +113,9 @@ The `-koe` or `-keeponexit` parameter governs the behavior when a `w.q` task is By default the data saved so far is deleted, as if the task were restarted it would be difficult to ensure it restarted from exactly the right place. It’s easier to replay the log and (re)write the data. If the flag is provided (or the `KEEPONEXIT` global set to `1b`) the data will not be removed. +:fontawesome-regular-map: +[Intraday writedown solutions](../wp/intraday-writedown/index.md) + ## Working with the TP logfile diff --git a/docs/wp/intraday-writedown/img/figure01.png b/docs/wp/intraday-writedown/img/figure01.png deleted file mode 100644 index 3f8c96005e7d0bc620b22e12125266d86c6c51e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41347 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 z 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 GgZ~FV3W0Y3 diff --git a/docs/wp/intraday-writedown/index.md b/docs/wp/intraday-writedown/index.md index 10cc6f1c3..2b842540b 100644 --- a/docs/wp/intraday-writedown/index.md +++ b/docs/wp/intraday-writedown/index.md @@ -24,9 +24,7 @@ Tests performed using kdb+ version 3.1 2014.02.08 ## Standard tick setup -Most kdb+ users will be familiar with a vanilla tick setup which has a tickerplant (TP) receiving data and then logging it to disk and publishing to an in-memory realtime database (RDB) which keeps all of the current day’s data in memory. At the end of the day the RDB then commits this data to disk in a separate historical database (HDB) which stores all of this historical data. This means that the most recent data (and often most important) always has the fastest access time as it is stored in RAM. - -![Figure 1](img/figure01.png) +Most kdb+ users will be familiar with a [vanilla tick setup](../../architecture/index.md) which has a tickerplant (TP) receiving data and then logging it to disk and publishing to an in-memory realtime database (RDB) which keeps all of the current day’s data in memory. At the end of the day the RDB then commits this data to disk in a separate historical database (HDB) which stores all of this historical data. This means that the most recent data (and often most important) always has the fastest access time as it is stored in RAM. The standard approach above can be limited by available RAM if daily data volumes grow too large. It is important to realize also that extra RAM is required to query the data, on top of what is required to keep it in memory. The extra amount required will vary depending on the different use cases and queries that are run on it. Consideration must also be given to other processes such as chained RDBs or HDBs which will need to share the resources on the server. @@ -35,12 +33,7 @@ One solution is to write down some of the data from the RDB to a temporary direc ## `w.q` -:fontawesome-brands-github: -[simongarland/tick](https://github.com/simongarland/tick) - -This script can easily be modified to work with any standard kdb+ setup. The important changes begin with the callback function `upd` which no longer simply inserts data into the table. - - +A [write-only RDB](../../kb/kdb-tick.md#write-only-rdb) script (`w.q`) can easily be modified to work with any standard kdb+ setup. The important changes begin with the callback function `upd` which no longer simply inserts data into the table. ```q append:{[t;data] t insert data; @@ -105,10 +98,10 @@ The table is not reorganized if the column we are parting the table by is alread The `w.q` script has an additional option to delete the temporary data on exit to handle recovery scenarios. The default behavior is to delete the temporary data and recover from the TP log as it is difficult to locate the point in the TP log which was last committed to disk. -## Limitations of `w.q` +### Limitations of `w.q` -### Downtime +#### Downtime When rolling the RDB at end of day it is very important to minimize the downtime of the RDB and to have the new date partition available as quickly as possible in the HDB. However, sorting very large tables on disk can add significant delay, no matter which sorting method is used. Table 1 describes the time taken (in seconds) to sort a quote table for increasing numbers of rows. The schema of the quote table is described below: @@ -137,7 +130,7 @@ Table 1: As can be seen, the amount of time taken to sort a simple table like the above is quite large. This may be a serious problem as yesterday’s data may not be queryable for a significant period each morning. -### Performance +#### Performance The `w.q` solution was intended more as an effective method to alleviate RAM problems during data capture than to be a queryable process. Since the most recent data will be in-memory and everything else is splayed on disk, any queries for intraday data will have to be run against both tables and be combined. The query against the on-disk splay with no attributes will have a significant impact on query performance. @@ -235,8 +228,6 @@ Each partition in our intraday writedown directory will store data for a single The advantage of of this method is that the data in the temporary directory can be queried much more efficiently as it is essentially partitioned by sym and sorted by time. The second processing time-saving is seen at EOD: no sort is required since the data is already divided by sym. Therefore, adding to the HDB reduces from an append-and-sort to a simple append. -This solution, of course, comes with its own drawbacks, namely added complexity in maintaining the data in the RDB and in creating the HDB partition. Also, querying the data will be much more complicated as result of the data being stored in a different format in memory and in the temporary directory. However, depending on the use case, the benefits may outweigh the drawbacks. - The solution begins by setting the following in the RDB. ```q @@ -467,7 +458,7 @@ appendHDB:{[tbls;dtDir] : This function works out what partitions are present (i.e. 0 20 56 222 etc.) and also what tables. After appending all the tables using `appendTable`, `.Q.chk` is performed on the new HDB partition to ensure no table has been missed out (e.g. if a `WRITETBLS` table received no updates that day). Finally each table in the HDB date partition has a `p` (parted) attribute applied. -## Querying partitioned writedown +### Querying partitioned writedown Before the query speeds for the different solutions can be compared, the method for querying the partitioned writedown must be discussed. The data for each table is no longer stored in one in-memory table but divided into a different table for each sym, both on-disk and in-memory. This is far from ideal but is one of the penalties that comes with this solution for dealing with low memory. @@ -573,6 +564,9 @@ time sym bid ask bsize asize The `genQuery` function could easily be expanded and refined based on what type of queries are run most often and how they are best optimized. However this function demonstrates the principles of how to query both the in-memory and the partitioned data structure together. +### Limitations + +This solution, of course, comes with its own drawbacks, namely added complexity in maintaining the data in the RDB and in creating the HDB partition. Also, querying the data will be much more complicated as result of the data being stored in a different format in memory and in the temporary directory. However, depending on the use case, the benefits may outweigh the drawbacks. ## Comparison of `w.q` and partitioned writedown From 0571b70582be16b27a7bce7e8ffc59d498e6b5d8 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Thu, 11 Jul 2024 11:05:48 +0100 Subject: [PATCH 04/40] tie togther pages about log files --- docs/kb/kdb-tick.md | 6 ++++++ docs/kb/logging.md | 3 +++ docs/kb/replay-log.md | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/kb/kdb-tick.md b/docs/kb/kdb-tick.md index 089f615ef..e8707d171 100644 --- a/docs/kb/kdb-tick.md +++ b/docs/kb/kdb-tick.md @@ -123,6 +123,12 @@ The TP logs the updates published to subscribers to a file. In the event of a se :fontawesome-brands-github: [simongarland/tickrecover/rescuelog.q](https://github.com/simongarland/tickrecover/blob/master/rescuelog.q) +:fontawesome-regular-map: +[Data recovery for kdb+tick](../wp/data-recovery.md) +
+:fontawesome-regular-map: +[Replaying log files](replay-log.md) + ## `c.q` diff --git a/docs/kb/logging.md b/docs/kb/logging.md index cf9a0dac2..e052e449d 100644 --- a/docs/kb/logging.md +++ b/docs/kb/logging.md @@ -198,6 +198,9 @@ Currently, only a single replicating process can subscribe to the primary proces _Q for Mortals_ [§13.2.6 Logging `-l` and `-L`](/q4m3/13_Commands_and_System_Variables/#1326-logging-l-and-l)
+:fontawesome-regular-map: +[Replaying log files](replay-log.md) +
:fontawesome-brands-github: [prodrive11/log4q](https://github.com/prodrive11/log4q) A concise implementation of logger for q applications diff --git a/docs/kb/replay-log.md b/docs/kb/replay-log.md index 9d301b0b5..e8323df10 100644 --- a/docs/kb/replay-log.md +++ b/docs/kb/replay-log.md @@ -8,7 +8,7 @@ date: December 2019 -Streaming-execute over a file is used (for example in kdb+tick) to replay logfiles in a memory-efficient manner. +Streaming-execute over a file is used (for example in kdb+tick) to replay [logfiles](logging.md) in a memory-efficient manner. :fontawesome-solid-book-open: [`-11!` streaming execute](../basics/internal.md#-11-streaming-execute) From 6d97d2b3b62147d915652303ebaaea7e38001118 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Thu, 11 Jul 2024 18:06:29 +0100 Subject: [PATCH 05/40] add streaming, abbreviations, etc --- docs/architecture/index.md | 30 +++++++++++++++--------------- docs/wp/data-recovery.md | 3 --- mkdocs.yml | 6 +++--- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/docs/architecture/index.md b/docs/architecture/index.md index eaac7fa8a..4e60220c3 100644 --- a/docs/architecture/index.md +++ b/docs/architecture/index.md @@ -14,22 +14,23 @@ The small footprint of the q interpreter, the [interprocess communication](../ba Certain kinds of process recur across applications. +## Components -## Data feed +### Data feed -This is a source of real-time data; for example, financial quotes and trades from [Bloomberg](https://www.bloomberg.com/professional/solution/content-and-data/) or [Refinitiv](https://www.refinitiv.com/), or readings from a network of sensors +This is a source of real-time data; for example, financial quotes and trades from [Bloomberg](https://www.bloomberg.com/professional/solution/content-and-data/) or [Refinitiv](https://www.refinitiv.com/), or readings from a network of sensors. -## Feedhandler +### Feedhandler Parses data from the data feed to a format that can be ingested by kdb+. KX’s [Fusion interfaces](../interfaces/index.md#fusion-interfaces) connect kdb+ to a range of other technologies, such as [R](../interfaces/r.md), Apache Kafka, Java, Python and [C](../interfaces/c-client-for-q.md). -## Tickerplant +### TP -Captures the initial data feed, writes it to the log file and [publishes](../kb/publish-subscribe.md) these messages to any registered subscribers. +A TP (tickerplant) captures the initial data feed, writes it to the log file and [publishes](../kb/publish-subscribe.md) these messages to any registered subscribers. Aims for zero-latency. Includes ingesting data in batch mode. @@ -44,14 +45,12 @@ Handles end-of-day (EOD) processing. For best resilience, and to avoid core resource competition, run them on their own cores. -### Log file +#### TP Log This is the file to which the Tickerplant logs the q messages it receives from the feedhandler. It is used for recovery: if the RDB has to restart, the log file is replayed to return to the current state. !!! tip "Best practices for log files" - The logging process can run on any hardware and OS, from a RaspberryPi to a cloud server. - Store the file on a fast local disk to minimize publication delay and I/O waits. :fontawesome-regular-map: @@ -61,9 +60,9 @@ This is the file to which the Tickerplant logs the q messages it receives from t [Linux production notes](../kb/linux-production.md) -## Real-time database +### RDB -Subscribes to messages from the Tickerplant, stores them in memory, and allows this data to be queried intraday. +A RDB (real-time database) subscribes to messages from the Tickerplant, stores them in memory, and allows this data to be queried intraday. At end of day usually writes intraday data to the Historical Database, and sends it a new EOD message. @@ -84,9 +83,10 @@ At end of day usually writes intraday data to the Historical Database, and sends [Intraday writedown solutions](../wp/intraday-writedown/index.md) -## Real-time subscriber +### RTE/RTS -Subscribes to the intraday messages and typically performs some additional function on receipt of new data – e.g. calculating an order book or maintaining a subtable with the latest price for each instrument. +A RTE (real-time engine) subscribes to the intraday messages and typically performs some additional function on receipt of new data – e.g. calculating an order book or maintaining a subtable with the latest price for each instrument. +A RTE is sometimes referred to as a RTS (real-time subscriber). !!! tip "Best practices for real-time subscribers" @@ -102,9 +102,9 @@ Subscribes to the intraday messages and typically performs some additional funct -## Historical database +### HDB -Provides a queryable data store of historical data; +A HDB (historical database) provides a queryable data store of historical data; for example, for creating customer reports on order execution times, or sensor failure analyses. Large tables are usually stored on disk partitioned by date, with each column stored as its own file. @@ -133,7 +133,7 @@ The dates are referred to as _partitions_ and this on-disk structure contributes [Compression in kdb+](../wp/compress/index.md) -## Gateway +### Gateway The entry point into the kdb+ system. Responsible for routing incoming queries to the appropriate processes, and returning their results. diff --git a/docs/wp/data-recovery.md b/docs/wp/data-recovery.md index ca75aa7f9..867d8e620 100644 --- a/docs/wp/data-recovery.md +++ b/docs/wp/data-recovery.md @@ -43,9 +43,6 @@ Historical database : The historical database (HDB) consists of on-disk kdb+ data, typically split into date partitions. A kdb+ process can read this data and memory-map it, allowing for fast queries across a large volume of data. The RDB is instructed to save its data to the HDB at EOD. -:fontawesome-regular-hand-point-right: -[kdb+ tick profiling for throughput optimization](tick-profiling.md) - This paper will primarily consider the relationship between the TP and RDB and in particular the use of tickerplant logs when recovering lost data in an RDB. diff --git a/mkdocs.yml b/mkdocs.yml index e709ec46a..791df8f40 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -524,15 +524,15 @@ nav: # - Environment: basics/environment.md - Developer tools: devtools.md - FAQ: kb/faq-listbox.md - - Architecture: + - Streaming: - General architecture: architecture/index.md - Alternative architecture: kb/kdb-tick.md - Alternative in-memory layouts: kb/alternative-in-memory-layouts.md - Corporate actions: kb/corporate-actions.md - - Data recovery for kdb+tick: wp/data-recovery.md + - Data recovery: wp/data-recovery.md - Disaster recovery: wp/disaster-recovery/index.md - Gateway design: wp/gateway-design/index.md - - kdb+tick profiling: wp/tick-profiling.md + - Profiling: wp/tick-profiling.md - Kubernetes: 'https://youtu.be/jqtkkCqBvr4' - Load balancing: kb/load-balancing.md - Order Book: wp/order-book.md From 8bf33c9f1443c186a9a0930fd05b8dd2db5d687b Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Fri, 12 Jul 2024 14:10:34 +0100 Subject: [PATCH 06/40] merge 2 pages about logs into 1 --- docs/basics/internal.md | 2 +- docs/kb/kdb-tick.md | 2 +- docs/kb/logging.md | 119 +++++++++++++++++++++++++++++++++++++--- docs/kb/replay-log.md | 110 ------------------------------------- mkdocs.yml | 3 +- 5 files changed, 114 insertions(+), 122 deletions(-) delete mode 100644 docs/kb/replay-log.md diff --git a/docs/basics/internal.md b/docs/basics/internal.md index c9ba3528e..38c1ce92d 100644 --- a/docs/basics/internal.md +++ b/docs/basics/internal.md @@ -150,7 +150,7 @@ Where `n` is a non-negative integer and `x` is a logfile handle In replaying, if the logfile references an undefined function, the function name is signalled as an error. :fontawesome-solid-graduation-cap: -[Replaying logfiles](../kb/replay-log.md) +[Log files](../kb/logging.md) ## `-14!x` (quote escape) diff --git a/docs/kb/kdb-tick.md b/docs/kb/kdb-tick.md index e8707d171..271bbe52e 100644 --- a/docs/kb/kdb-tick.md +++ b/docs/kb/kdb-tick.md @@ -127,7 +127,7 @@ The TP logs the updates published to subscribers to a file. In the event of a se [Data recovery for kdb+tick](../wp/data-recovery.md)
:fontawesome-regular-map: -[Replaying log files](replay-log.md) +[Log files](logging.md) ## `c.q` diff --git a/docs/kb/logging.md b/docs/kb/logging.md index e052e449d..4222b752b 100644 --- a/docs/kb/logging.md +++ b/docs/kb/logging.md @@ -1,13 +1,13 @@ --- title: Logging, recovery and replication – Knowledge Base – kdb+ and q documentation description: Software or hardware problems can cause a kdb+ server process to fail, possibly resulting in loss of data not saved to disk at the time of the failure. A kdb+ server can use logging of updates to avoid data loss when failures occur; note that the message is logged only if it changes the state of the process’ data. -keywords: kdb+, log, logging, q, replication +keywords: kdb+, log, logging, q, replication, recovery --- -# Logging, recovery and replication - +# Using log files: logging, recovery and replication +## Creating a log file Software or hardware problems can cause a kdb+ server process to fail, possibly resulting in loss of data not saved to disk at the time of the failure. A kdb+ server can use logging of updates to avoid data loss when failures occur; note that the message is logged only if it changes the state of the process’ data. @@ -64,7 +64,7 @@ size | 1625 ``` -## Check-pointing +## Check-pointing / Rolling A logging server uses a `.log` file and a `.qdb` data file. The command [`\l`](../basics/syscmds.md#l-load-file-or-directory) checkpoints the `.qdb` file and empties the log file. @@ -140,7 +140,7 @@ results in ``` -## Files +## File read order When you type @@ -192,15 +192,118 @@ If the replicating process loses its connection to the logging process, you can Currently, only a single replicating process can subscribe to the primary process. If another kdb+ process attempts to replicate from the primary, the previous replicating process will no longer receive updates. If you need multiple replicating processes, you might like to consider [kdb+tick](../learn/startingkdb/tick.md). + +## Replaying log files + + +Streaming-execute over a file is used (for example in kdb+tick) to replay [logfiles](logging.md) in a memory-efficient manner. + +:fontawesome-solid-book-open: +[`-11!` streaming execute](../basics/internal.md#-11-streaming-execute) + +A logfile is just a list of lists, and each list is read in turn and evaluated by [`.z.ps`](../ref/dotz.md#zps-set) (which defaults to [`value`](../ref/value.md)). + +Here, for demonstration purposes, we manually create a logfile, and play it back through `-11!`. This is functionally equivalent to doing ``value each get `:logfile`` but uses far less memory. + +```q +q)`:logfile.2013.12.03 set () / create a new,empty log file +`:logfile.2013.12.03 +q)h:hopen `:logfile.2013.12.03 / open it +q)h enlist(`f;`a;10) / append a record +3i +q)h enlist(`f;`b;20) / append a record +3i +q)hclose h / close the file +q)/Define the function that is referenced in those records +q)f:{0N!(x;y)} +q)-11!`:logfile.2013.12.03 / playback the logfile +(`a;10) +(`b;20) +2 +q)/ DO NOT DO THIS ON LARGE LOGFILES!!!! +q)/This is the whole purpose of -11!x. +q)value each get `:logfile.2013.12.03 +(`a;10) +(`b;20) +`a 10 +`b 20 +``` + +If successful, the number of chunks executed is returned. If the end of the file is corrupt a `badtail` error is signalled. In the event that the log file references an undefined function, the function name is signalled as an error. This can be confusing if the missing function name is `upd`, as it does not reflect the same situation as the license expiry `upd` error. e.g. + +```q +/ Continuing the above example +q)delete f from `. +`. +q)/function f no longer defined, so it signals an error +q)-11!`:logfile.2013.12.03 +'f +``` + +:fontawesome-brands-github: [github.com/simongarland/tickrecover/rescuelog.q](https://github.com/simongarland/tickrecover/blob/master/rescuelog.q) for examples of usage + + + +### Replay part of a file + +Streaming-execute the first `n` chunks of logfile `x`, return the number of chunks if successful: `-11!(n;x)`. + +It is possible to use the above to playback `n` records from record `M` onwards. + +Firstly create a sample log file, which contains 1000 records as +`((`f;0);(`f;1);(`f;2);..;(`f;999))`. + +```q +q)`:log set();h:hopen`:log;i:0;do[1000;h enlist(`f;i);i+:1];hclose h; +``` + +Then define function `f` to just print its arg, skip the first `M` records. If [`.z.ps`](../ref/dotz.md#zps-set) is defined, `-11!` calls it for each record. + +```q +q)m:0;M:750;f:0N!;.z.ps:{m+:1;if[m>M;value x;];};-11!(M+5-1;`:log) +750 +751 +752 +753 +754 +``` + + +### Replay from corrupt logs + +Given a valid logfile `x`, `-11(-2;x)` returns the number of chunks. + +Given an invalid logfile, returns the number of valid chunks and length of the valid part. + +```q +q)logfile:`:good.log / a non-corrupted logfile +q)-11!(-2;logfile) +26 +q)logfile:`:broken.log / a manually corrupted logfile +q)/define a dummy upd file as components are of the form (`upd;data) +q)upd:{[x;y]} +q)-11!logfile +'badtail +q)-11!(-1;logfile) +'badtail +q)hcount logfile +39623 +q)-11!(-2;logfile) +26 +35634 +q)/ 26 valid chunks until position 35634 (out of 39623) +q)-11!(26;logfile) +26 +``` + + --- :fontawesome-solid-street-view: _Q for Mortals_ [§13.2.6 Logging `-l` and `-L`](/q4m3/13_Commands_and_System_Variables/#1326-logging-l-and-l)
-:fontawesome-regular-map: -[Replaying log files](replay-log.md) -
:fontawesome-brands-github: [prodrive11/log4q](https://github.com/prodrive11/log4q) A concise implementation of logger for q applications + diff --git a/docs/kb/replay-log.md b/docs/kb/replay-log.md deleted file mode 100644 index e8323df10..000000000 --- a/docs/kb/replay-log.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: Replay a logfile with kdb+ | Knowledge Base | kdb+ and q documentation -description: How to replay a logfile in kdb+ with streaming execute -author: Stephen Taylor -date: December 2019 ---- -# Replaying log files - - - -Streaming-execute over a file is used (for example in kdb+tick) to replay [logfiles](logging.md) in a memory-efficient manner. - -:fontawesome-solid-book-open: -[`-11!` streaming execute](../basics/internal.md#-11-streaming-execute) - -A logfile is just a list of lists, and each list is read in turn and evaluated by [`.z.ps`](../ref/dotz.md#zps-set) (which defaults to [`value`](../ref/value.md)). - -Here, for demonstration purposes, we manually create a logfile, and play it back through `-11!`. This is functionally equivalent to doing ``value each get `:logfile`` but uses far less memory. - -```q -q)`:logfile.2013.12.03 set () / create a new,empty log file -`:logfile.2013.12.03 -q)h:hopen `:logfile.2013.12.03 / open it -q)h enlist(`f;`a;10) / append a record -3i -q)h enlist(`f;`b;20) / append a record -3i -q)hclose h / close the file -q)/Define the function that is referenced in those records -q)f:{0N!(x;y)} -q)-11!`:logfile.2013.12.03 / playback the logfile -(`a;10) -(`b;20) -2 -q)/ DO NOT DO THIS ON LARGE LOGFILES!!!! -q)/This is the whole purpose of -11!x. -q)value each get `:logfile.2013.12.03 -(`a;10) -(`b;20) -`a 10 -`b 20 -``` - -If successful, the number of chunks executed is returned. If the end of the file is corrupt a `badtail` error is signalled. In the event that the log file references an undefined function, the function name is signalled as an error. This can be confusing if the missing function name is `upd`, as it does not reflect the same situation as the license expiry `upd` error. e.g. - -```q -/ Continuing the above example -q)delete f from `. -`. -q)/function f no longer defined, so it signals an error -q)-11!`:logfile.2013.12.03 -'f -``` - -:fontawesome-brands-github: [github.com/simongarland/tickrecover/rescuelog.q](https://github.com/simongarland/tickrecover/blob/master/rescuelog.q) for examples of usage - - - -## Replay part of a file - -Streaming-execute the first `n` chunks of logfile `x`, return the number of chunks if successful: `-11!(n;x)`. - -It is possible to use the above to playback `n` records from record `M` onwards. - -Firstly create a sample log file, which contains 1000 records as -`((`f;0);(`f;1);(`f;2);..;(`f;999))`. - -```q -q)`:log set();h:hopen`:log;i:0;do[1000;h enlist(`f;i);i+:1];hclose h; -``` - -Then define function `f` to just print its arg, skip the first `M` records. If [`.z.ps`](../ref/dotz.md#zps-set) is defined, `-11!` calls it for each record. - -```q -q)m:0;M:750;f:0N!;.z.ps:{m+:1;if[m>M;value x;];};-11!(M+5-1;`:log) -750 -751 -752 -753 -754 -``` - - -## Size of a logfile - -Given a valid logfile `x`, `-11(-2;x)` returns the number of chunks. - -Given an invalid logfile, returns the number of valid chunks and length of the valid part. - -```q -q)logfile:`:good.log / a non-corrupted logfile -q)-11!(-2;logfile) -26 -q)logfile:`:broken.log / a manually corrupted logfile -q)/define a dummy upd file as components are of the form (`upd;data) -q)upd:{[x;y]} -q)-11!logfile -'badtail -q)-11!(-1;logfile) -'badtail -q)hcount logfile -39623 -q)-11!(-2;logfile) -26 -35634 -q)/ 26 valid chunks until position 35634 (out of 39623) -q)-11!(26;logfile) -26 -``` - diff --git a/mkdocs.yml b/mkdocs.yml index 791df8f40..ef24cd94c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -492,12 +492,11 @@ nav: - Firewalling: kb/firewalling.md - inetd, xinetd: kb/inetd.md - Linux production notes: kb/linux-production.md - - Logging: kb/logging.md + - Log Files: kb/logging.md - Multi-threading: wp/multi-thread/index.md - Multiple versions: kb/versions.md - Parallel processing: basics/peach.md - Performance tips: kb/performance-tips.md - - Replay logfile: kb/replay-log.md - Shebang script: develop/shebang.md - Surveillance latency: wp/surveillance-latency/index.md - Windows service: kb/windows-service/index.md From 1d2032f31e1fa8b59ce7dcecbae0961ade4cf20d Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Fri, 12 Jul 2024 15:43:52 +0100 Subject: [PATCH 07/40] example instructions to create log were incorrect --- docs/kb/logging.md | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/docs/kb/logging.md b/docs/kb/logging.md index 4222b752b..cbd613a81 100644 --- a/docs/kb/logging.md +++ b/docs/kb/logging.md @@ -5,7 +5,7 @@ keywords: kdb+, log, logging, q, replication, recovery --- # Using log files: logging, recovery and replication - +!!! warning "This should not be confused with a file that logs human readable warnings, errors, etc. It refers to a log of instructions to regain state." ## Creating a log file @@ -19,41 +19,37 @@ Software or hardware problems can cause a kdb+ server process to fail, possibly Logging is enabled by using the [`-l` or `-L` command-line arguments](../basics/cmdline.md#-l-log-updates). -```bash -$ q logTest -l +This example will require a file `trade.q` containing instructions to create a trade table: +```q +trade:([]time:`time$();sym:`symbol$();price:`float$();size:`int$()) ``` -```q -q)\p 5001 -q)\l trade.q +Start kdb+, loading `trade.q` while enabling recording to `trade.log` (note: this also uses `-p 5001` to allow client connections to port 5001): + +```bash +$ q trade -l -p 5001 ``` Now update messages from clients are logged. For instance: ```q q)/ this is a client -q)h: hopen `:localhost:5001 -q)h "insert[`trade](10:30:01; `intel; 88.5; 1625)" -q)h "last trade" -time | 10:30:01.000 -sym | `intel -price| 88.5 -size | 1625 +q)h:hopen `:localhost:5001 +q)h "insert[`trade](10:30:01.000; `intel; 88.5; 1625)" ``` +In the server instance, run `count trade` to check the trade table is now populated with one row. Assume that the kdb+ server process dies. If we now restart it with logging on, the updates logged to disk are not lost: ```bash -q logTest -l +q q trade -l -p 5001 ``` ```q -q)last trade -time | 10:30:01.000 -sym | `intel -price| 88.5 -size | 1625 +q)count trade +1 ``` + !!! warning "Updates done locally in the server process are logged to disk only if they are sent as messages to self" The syntax for this uses `0` as the handle: @@ -64,7 +60,7 @@ size | 1625 ``` -## Check-pointing / Rolling +## Check-pointing / rolling A logging server uses a `.log` file and a `.qdb` data file. The command [`\l`](../basics/syscmds.md#l-load-file-or-directory) checkpoints the `.qdb` file and empties the log file. @@ -196,7 +192,7 @@ Currently, only a single replicating process can subscribe to the primary proces ## Replaying log files -Streaming-execute over a file is used (for example in kdb+tick) to replay [logfiles](logging.md) in a memory-efficient manner. +Streaming-execute over a file is used (for example in kdb+tick) to replay a log file in a memory-efficient manner. :fontawesome-solid-book-open: [`-11!` streaming execute](../basics/internal.md#-11-streaming-execute) @@ -243,7 +239,6 @@ q)-11!`:logfile.2013.12.03 :fontawesome-brands-github: [github.com/simongarland/tickrecover/rescuelog.q](https://github.com/simongarland/tickrecover/blob/master/rescuelog.q) for examples of usage - ### Replay part of a file Streaming-execute the first `n` chunks of logfile `x`, return the number of chunks if successful: `-11!(n;x)`. @@ -296,7 +291,6 @@ q)-11!(26;logfile) 26 ``` - --- :fontawesome-solid-street-view: From 5e387af7cc1466a033ba060c52cd9138511c97b4 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Fri, 12 Jul 2024 16:12:53 +0100 Subject: [PATCH 08/40] consolidated dup definition of kdb-tick --- docs/architecture/index.md | 4 ++++ docs/wp/data-recovery.md | 21 +-------------------- 2 files changed, 5 insertions(+), 20 deletions(-) diff --git a/docs/architecture/index.md b/docs/architecture/index.md index 4e60220c3..c2c8d9627 100644 --- a/docs/architecture/index.md +++ b/docs/architecture/index.md @@ -25,6 +25,8 @@ This is a source of real-time data; for example, financial quotes and trades fro Parses data from the data feed to a format that can be ingested by kdb+. +Multiple feed handlers can be used to gather data from a number of different sources and feed it to the kdb+ system for storage and analysis. + KX’s [Fusion interfaces](../interfaces/index.md#fusion-interfaces) connect kdb+ to a range of other technologies, such as [R](../interfaces/r.md), Apache Kafka, Java, Python and [C](../interfaces/c-client-for-q.md). @@ -64,6 +66,8 @@ This is the file to which the Tickerplant logs the q messages it receives from t A RDB (real-time database) subscribes to messages from the Tickerplant, stores them in memory, and allows this data to be queried intraday. +At startup, the RDB sends a message to the tickerplant and receives a reply containing the data schema, the location of the log file, and the number of lines to read from the log file. It then receives subsequent updates from the TP as they are published. + At end of day usually writes intraday data to the Historical Database, and sends it a new EOD message. !!! tip "Best practices for real-time databases" diff --git a/docs/wp/data-recovery.md b/docs/wp/data-recovery.md index 867d8e620..0ae4244e1 100644 --- a/docs/wp/data-recovery.md +++ b/docs/wp/data-recovery.md @@ -25,26 +25,7 @@ All tests were run using kdb+ version 3.1 (2014.03.27). ## kdb+tick -kdb+tick is an architecture which allows the capture, processing and querying of data in real time and historically. It typically consists of: - -The feedhandler - -: A feedhandler is a process which captures external data and translates it into kdb+ messages. Multiple feed handlers can be used to gather data from a number of different sources and feed it to the kdb+ system for storage and analysis. - -The tickerplant - -: The tickerplant (TP) is a specialized kdb+ process that operates as a link between the client’s data feed and a number of subscribers. It receives data from the feedhandler, appends a time stamp to it and saves it to a log file. It publishes this data to a real-time database (RDB) and any clients which have subscribed to it, and then purges its tables of data. In this way the tickerplant uses very little memory, whilst a full record of intra-day data is maintained in the real-time database. - -Real-time database - -: The real-time database (RDB) holds all the intra-day data in-memory to allow for fast, powerful queries. At startup, the RDB sends a message to the tickerplant and receives a reply containing the data schema, the location of the log file, and the number of lines to read from the log file. It then receives subsequent updates from the TP as they are published. - -Historical database - -: The historical database (HDB) consists of on-disk kdb+ data, typically split into date partitions. A kdb+ process can read this data and memory-map it, allowing for fast queries across a large volume of data. The RDB is instructed to save its data to the HDB at EOD. - -This paper will primarily consider the relationship between the TP and RDB and in particular the use of tickerplant logs when recovering lost data in an RDB. - +This paper will primarily consider the relationship between the TP and RDB in a [kdb+tick architecture](../architecture/index.md). In particular, the use of tickerplant logs when recovering lost data in an RDB. ### Schemas From 4eb2bda8ca5e12aefb4169814d837aef0686f69e Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Fri, 12 Jul 2024 16:22:28 +0100 Subject: [PATCH 09/40] removed dup diagrams --- docs/wp/ipc/img/tick-diagram.png | Bin 56588 -> 0 bytes docs/wp/ipc/index.md | 4 +--- docs/wp/rt-tick/img/image1.png | Bin 192105 -> 0 bytes docs/wp/rt-tick/index.md | 4 +--- 4 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 docs/wp/ipc/img/tick-diagram.png delete mode 100644 docs/wp/rt-tick/img/image1.png diff --git a/docs/wp/ipc/img/tick-diagram.png b/docs/wp/ipc/img/tick-diagram.png deleted file mode 100644 index d879077eaf033ff27fd904fe102dcacbd4f95767..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56588 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 diff --git a/docs/wp/ipc/index.md b/docs/wp/ipc/index.md index 592a25dff..97b6e9085 100644 --- a/docs/wp/ipc/index.md +++ b/docs/wp/ipc/index.md @@ -617,8 +617,6 @@ handle| ip user status ## Application of IPC in a kdb+ tick system -![Tick diagram](img/tick-diagram.png) - :fontawesome-solid-graduation-cap: [Realtime database](../../learn/startingkdb/tick.md)
@@ -632,7 +630,7 @@ The core elements of this kdb+ tick setup are - A historical database (HDB) - A source of data (feed) -The discussion uses the KX tick code to explore how IPC is used in a vanilla tick application. +The discussion uses the KX tick code to explore how IPC is used in a [vanilla tick application](../../architecture/index.md). :fontawesome-brands-github: [KxSystems/kdb-tick](https://github.com/KxSystems/kdb-tick) diff --git a/docs/wp/rt-tick/img/image1.png b/docs/wp/rt-tick/img/image1.png deleted file mode 100644 index 8c203fb18dbe4e4df02d6a22f7c072d8fdb57fab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192105 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

gBg6yz^PT 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 Date: Fri, 12 Jul 2024 16:31:20 +0100 Subject: [PATCH 10/40] removed log info from alternative arch page (not correct context) --- docs/kb/kdb-tick.md | 13 ------------- docs/kb/logging.md | 10 +++++++--- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/docs/kb/kdb-tick.md b/docs/kb/kdb-tick.md index 271bbe52e..e6ce4e87c 100644 --- a/docs/kb/kdb-tick.md +++ b/docs/kb/kdb-tick.md @@ -117,19 +117,6 @@ It’s easier to replay the log and (re)write the data. If the flag is provided [Intraday writedown solutions](../wp/intraday-writedown/index.md) -## Working with the TP logfile - -The TP logs the updates published to subscribers to a file. In the event of a serious crash, this file can be rescued using the utility functions in -:fontawesome-brands-github: -[simongarland/tickrecover/rescuelog.q](https://github.com/simongarland/tickrecover/blob/master/rescuelog.q) - -:fontawesome-regular-map: -[Data recovery for kdb+tick](../wp/data-recovery.md) -
-:fontawesome-regular-map: -[Log files](logging.md) - - ## `c.q` Another often-overlooked problem is users fetching vast amounts of raw data to calculate something that could much better be built once, incrementally updated, and then made available to all interested clients. diff --git a/docs/kb/logging.md b/docs/kb/logging.md index cbd613a81..8488da61d 100644 --- a/docs/kb/logging.md +++ b/docs/kb/logging.md @@ -225,7 +225,11 @@ q)value each get `:logfile.2013.12.03 `b 20 ``` -If successful, the number of chunks executed is returned. If the end of the file is corrupt a `badtail` error is signalled. In the event that the log file references an undefined function, the function name is signalled as an error. This can be confusing if the missing function name is `upd`, as it does not reflect the same situation as the license expiry `upd` error. e.g. +If successful, the number of chunks executed is returned. + +If the end of the file is corrupt a `badtail` error is signalled, which may be partially [recovered](#replay-from-corrupt-logs). + +In the event that the log file references an undefined function, the function name is signalled as an error. This can be confusing if the missing function name is `upd`, as it does not reflect the same situation as the license expiry `upd` error. e.g. ```q / Continuing the above example @@ -236,8 +240,6 @@ q)-11!`:logfile.2013.12.03 'f ``` -:fontawesome-brands-github: [github.com/simongarland/tickrecover/rescuelog.q](https://github.com/simongarland/tickrecover/blob/master/rescuelog.q) for examples of usage - ### Replay part of a file @@ -291,6 +293,8 @@ q)-11!(26;logfile) 26 ``` +:fontawesome-brands-github: [github.com/simongarland/tickrecover/rescuelog.q](https://github.com/simongarland/tickrecover/blob/master/rescuelog.q) contains some helper functions for recovering data from logs. + --- :fontawesome-solid-street-view: From 3c9bb3b398abc0e38c4f84b0fe59cbfa248d48ac Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Fri, 12 Jul 2024 16:39:54 +0100 Subject: [PATCH 11/40] split alternative arch into relevant categories --- docs/kb/kdb-tick.md | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/docs/kb/kdb-tick.md b/docs/kb/kdb-tick.md index e6ce4e87c..b1b3a8726 100644 --- a/docs/kb/kdb-tick.md +++ b/docs/kb/kdb-tick.md @@ -11,7 +11,9 @@ A [‘vanilla’](../architecture/index.md) tick setup has a tickerplant (TP) lo It doesn’t have to be that way. There are a _many_ other ways of assembling the kdb+tick “building blocks” to reduce or share the load. -## Chained tickerplants +## TP + +### Chained tickerplants If the primary tickerplant is running in zero-latency mode (i.e. all updates are published immediately to subscribers) it can be inefficient to have a client task that is only plotting graphs subscribe for instantaneous update. An update every few seconds would be quite adequate. @@ -25,7 +27,7 @@ If the primary tickerplant is a zero-latency tickerplant the chained tickerplant For example if clients are using data from the tickerplant to drive a GUI, it may not need updates hundreds of times per second. A tickerplant that updates once a second would suffice -### Example +#### Example The example script [`chainedtick.q`](https://github.com/KxSystems/kdb/blob/master/tick/chainedtick.q) can be run as follows: ```bash @@ -51,7 +53,9 @@ q chainedtick.q :5010 -p 5110 -t 0 :fontawesome-brands-github: [KxSystems/kdb-tick/tick/u.q](https://github.com/KxSystems/kdb-tick/blob/master/tick/u.q) -## Chained RDBs +## RDB + +### Chained RDBs A chained RDB can either be connected to the primary tickerplant, or to a chained tickerplant. Unlike a default RDB, the chained RDB doesn't have any day-end processing beyond emptying all tables. @@ -64,7 +68,7 @@ It might be useful to have an RDB with only the stocks building a particular ind Don’t forget though that a second RDB will increase the memory usage, as it's an in-memory database and can’t be sharing any data with the primary RDB. -### Example +#### Example The example script [`chainedr.q`](https://github.com/KxSystems/kdb/blob/master/tick/chainedr.q) can be run as follows: ```bash @@ -78,7 +82,7 @@ $ q chainedr.q :5010 -p 5111 :fontawesome-brands-github: [KxSystems/kdb/tick/chainedr.q](https://github.com/KxSystems/kdb/blob/master/tick/chainedr.q) -## Write-only RDB +### Write-only RDB The default behavior of the RDB is to collect data to an in-memory database during the day and then to save it to disk as an historical partition at day end. This makes sense if it’s actually queried during the day, but if the only reason for having an RDB is to be able to save the historical partition @@ -116,8 +120,9 @@ It’s easier to replay the log and (re)write the data. If the flag is provided :fontawesome-regular-map: [Intraday writedown solutions](../wp/intraday-writedown/index.md) +## RTE -## `c.q` +### `c.q` Another often-overlooked problem is users fetching vast amounts of raw data to calculate something that could much better be built once, incrementally updated, and then made available to all interested clients. @@ -129,7 +134,7 @@ A more interesting example is keeping a table of the latest trade and the associ [KxSystems/kdb/tick/c.q](https://github.com/KxSystems/kdb/blob/master/tick/c.q) -## `clog.q` +### `clog.q` The default version of `c.q` linked to above connects to a TP and starts collecting data. Sometimes that’s not enough and you want to replay the log through the task first. (For example, to get the Open/High/Low for the day, not just since starting the task.) For that, use `clog.q` instead. @@ -137,7 +142,7 @@ The default version of `c.q` linked to above connects to a TP and starts collect [simongarland/tick/clog.q](https://github.com/simongarland/tick/blob/master/clog.q) -## `daily.q` +### `daily.q` By default, the end-of-day processing simply saves the intra-day RDB to disk after a little re-organization. From 4364c696e219d5c43121dca3d1a6c2d6aacefb17 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Mon, 15 Jul 2024 09:11:00 +0100 Subject: [PATCH 12/40] async callback for c client in wrong place --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index ef24cd94c..699b1d840 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -458,7 +458,6 @@ nav: - Listening port: basics/listening-port.md - Deferred response: kb/deferred-response.md - Async callbacks: kb/callbacks.md - - Async callbacks (C client): kb/server-calling-client.md - Named pipes: kb/named-pipes.md - Serialization examples: kb/serialization.md - Socket sharding: wp/socket-sharding/index.md @@ -548,6 +547,7 @@ nav: - API reference: interfaces/capiref.md - C API for kdb+: wp/capi/index.md - Using C/C++ functions: interfaces/using-c-functions.md + - Async callbacks (C client): kb/server-calling-client.md - C#: interfaces/csharp.md - Foreign Function Interface (FFI): interfaces/ffi.md - Java: interfaces/java.md From bea3d71c75561cea39083f8ab3c1100142b4c59a Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Mon, 15 Jul 2024 09:41:10 +0100 Subject: [PATCH 13/40] removed 32bit mention, fixed link, linux first --- docs/learn/startingkdb/tick.md | 27 +++++++++++---------------- mkdocs.yml | 2 +- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/docs/learn/startingkdb/tick.md b/docs/learn/startingkdb/tick.md index a9855ed3b..dcbd8766f 100644 --- a/docs/learn/startingkdb/tick.md +++ b/docs/learn/startingkdb/tick.md @@ -26,11 +26,6 @@ In practice, much larger RAM might be used. Data feeds can be any market or other time-series data. A feedhandler converts the data stream into a format suitable for writing to kdb+. These are usually written in a compiled language, such as C, C++, Java or C\#. -A Reuters RFA feedhandler is available. - -:fontawesome-brands-github: -[KxSystems/kdb/c/feed/rfa.zip](https://github.com/KxSystems/kdb/blob/master/c/feed/rfa.zip) - In the example described here, the data feed is generated at random by a kdb+ process. @@ -108,16 +103,16 @@ Install the demo scripts. The demo displays each kdb+ process in its own window. -=== ":fontawesome-brands-apple: macOS" - - Run the `start/tick/run.app` application from Finder. (Consult the `README` as changes must be made to the default Terminal settings.) - === ":fontawesome-brands-linux: Linux" ```bash start/tick/run.sh ``` +=== ":fontawesome-brands-apple: macOS" + + Run the `start/tick/run.app` application from Finder. (Consult the `README` as changes must be made to the default Terminal settings.) + === ":fontawesome-brands-windows: Windows" ```bash @@ -158,9 +153,9 @@ If the run scripts are unsuitable for your system, then you can call each proces kdb+tick uses paths relative to the local directory. To run correctly, you should change directory such that `tick.q` is in the local directory. For example on macOS, for each of the following commands, open a new terminal, change directory to `~/q/start/tick`, then: ```bash -~/q/start/tick$ ~/q/m32/q tick.q -p 5010 -~/q/start/tick$ ~/q/m32/q feed.q localhost:5010 -t 107 -~/q/start/tick$ ~/q/m32/q tick/r.q -p 5011 +q tick.q -p 5010 +q feed.q localhost:5010 -t 107 +q tick/r.q -p 5011 ``` Refer to `run1.sh` for the remaining processes. @@ -211,25 +206,25 @@ DOW 24.23159 705727 The standard components of kdb+tick support various options. In the basic set-up outlined here, the tickerplant publishes all data immediately, and does not create a log file. Optional parameters of ```bash -~/q/m32/q tick.q [schema] [destination directory] [-t N] -p 5010 +q tick.q [schema] [destination directory] [-t N] -p 5010 ``` can be supplied. If the destination directory is set, then the schema must also be defined. To modify the supplied example to create a tickerplant log file and to publish data in 1-second batches rather than immediately, start the process with: ```bash -~/q/m32/q tick.q sym ./hdb -t 1000 -p 5010 +q tick.q sym ./hdb -t 1000 -p 5010 ``` Similarly the real-time database can be started with optional host:port:user:pass of the tickerplant and historic database to reload at end-of-day: ```bash -~/q/m32/q tick/r.q [tickerplant host:port] [hdb host:port] -p 5011 +q tick/r.q [tickerplant host:port] [hdb host:port] -p 5011 ``` e.g. ```bash -~/q/m32/q tick/r.q :5010 :5012 -p 5011 +q tick/r.q :5010 :5012 -p 5011 ``` diff --git a/mkdocs.yml b/mkdocs.yml index 699b1d840..bbfc99057 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -133,7 +133,7 @@ nav: - IDE: learn/tour/ide.md - Q for quants: learn/brief-introduction.md - Q by Examples: learn/q-by-examples.md - - Q for All: learn/q-for-all.md + - Q for All (video): learn/q-for-all.md # - Q for Pythons: # - Introduction: learn/python/index.md # - Primer: From d08de4eae2afab53307289146553437782a12d6b Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Mon, 15 Jul 2024 15:05:40 +0100 Subject: [PATCH 14/40] fixed instructions for kdb-tick demo --- docs/learn/startingkdb/ipc.md | 3 + docs/learn/startingkdb/tick.md | 102 +++++++++++---------------------- 2 files changed, 37 insertions(+), 68 deletions(-) diff --git a/docs/learn/startingkdb/ipc.md b/docs/learn/startingkdb/ipc.md index adae457ec..dfae6af07 100644 --- a/docs/learn/startingkdb/ipc.md +++ b/docs/learn/startingkdb/ipc.md @@ -97,3 +97,6 @@ There are examples in the [Realtime Database](tick.md) chapter, where a process ## HTTP connections A kdb+ server can also be accessed via HTTP. To try this, run a kdb+ server on your machine with port 5001. Then, load a Web browser, and go to `http://localhost:5001`. You can now see the names defined in the base context. + +:fontawesome-regular-map: +[IPC overview](../../basics/ipc.md) diff --git a/docs/learn/startingkdb/tick.md b/docs/learn/startingkdb/tick.md index dcbd8766f..4aa4ff6e9 100644 --- a/docs/learn/startingkdb/tick.md +++ b/docs/learn/startingkdb/tick.md @@ -44,9 +44,6 @@ Other processes would subscribe to a tickerplant to receive new data, and each w The demo scripts run a simple tickerplant/RDB configuration. -:fontawesome-brands-github: -[KxSystems/cookbook/start/tick](https://github.com/KxSystems/kdb/blob/master/d/a/tick.htm) - The layout is: ```txt @@ -69,101 +66,70 @@ tickerplant : gets data from feed and pushes it to clients that have subscribed. Once the data is written, it is discarded. -rdb, vwap, hlcv, tq, last +rdb + +: is an RDB (realtime database) than stores all intra-day data received in memory -: are databases that have subscribed to the tickerplant. Note that these databases can be queried by a client application. +vwap, hlcv, tq, last, show + +: are RTE (realtime engines) that have subscribed to the tickerplant. Note that these databases can be queried by a client application. database | role ---------|------- -rdb | has all of today’s data vwap | has volume-weighted averages for selected stocks hlcv | has high, low, close, volume for selected stocks tq | has a trade and quote table for selected stocks; each row is a trade joined with the most recent quote last | has the last entries for each stock in the trade and quote tables show | counts the updates, and displays the counts periodically -Note that all the client processes load the same script file `cx.q`, with a parameter that selects the corresponding code for the process in that file. Alternatively, each process could load its own script file, but since the definitions tend to be very short, it is convenient to use a single script for all. More examples: +Note that all the client processes load the same script file `cx.q`, with a parameter that selects the corresponding code for the process in that file. Alternatively, each process could load its own script file, but since the definitions tend to be very short, it is convenient to use a single script for all. More RTE examples: :fontawesome-brands-github: [KxSystems/kdb/tick/c.q](https://github.com/KxSystems/kdb/blob/master/tick/c.q) :fontawesome-brands-github: [KxSystems/kdb/e/c.q](https://github.com/KxSystems/kdb/blob/master/e/c.q) -## Running the demo +### Running the demo -Install kdb+tick. +Download kdb+tick. :fontawesome-brands-github: [KxSystems/kdb-tick](https://github.com/KxSystems/kdb-tick) -Install the demo scripts. +Download the demo scripts. :fontawesome-brands-github: [KxSystems/cookbook/start/tick](https://github.com/KxSystems/cookbook/tree/master/start/tick) -The demo displays each kdb+ process in its own window. - -=== ":fontawesome-brands-linux: Linux" - - ```bash - start/tick/run.sh - ``` - -=== ":fontawesome-brands-apple: macOS" - - Run the `start/tick/run.app` application from Finder. (Consult the `README` as changes must be made to the default Terminal settings.) - -=== ":fontawesome-brands-windows: Windows" - - ```bash - start/tick/run.bat - ``` - -The calls starting each process are essentially: - -1. tickerplant – the `tick.q` script defines the tickerplant, and runs on port 5010 - - ```bash - q tick.q -p 5010 - ``` - -2. feed – the `feed.q` script connects to the tickerplant and sends a new batch every 507 milliseconds - - ```bash - q feed.q localhost:5010 -t 507 - ``` - -3. rdb – the `r.q` script defines the real time database - - ```bash - q tick/r.q -p 5011 - ``` +Copy `sym.q` (table schema) to `/tick/sym.q` -4. show – the `show` process, which does not need a port - - ```bash - q cx.q show - ``` - - -## Running processes manually - -If the run scripts are unsuitable for your system, then you can call each process manually. In each case, open up a new terminal window, change to the `QHOME` directory and enter the appropriate command. The tickerplant should be started first. - -kdb+tick uses paths relative to the local directory. To run correctly, you should change directory such that `tick.q` is in the local directory. For example on macOS, for each of the following commands, open a new terminal, change directory to `~/q/start/tick`, then: - -```bash +From the downloaded `kdb-tick` directory create a tickerplant: +```q q tick.q -p 5010 -q feed.q localhost:5010 -t 107 +``` +from a seperate terminal window, start an RDB: +```q q tick/r.q -p 5011 ``` -Refer to `run1.sh` for the remaining processes. +From this directory run each of the following realtime engines in seperate terminal windows: + +```q +q cx.q hlcv -p 5014 -t 1000 +q cx.q last -p 5015 -t 1000 +q cx.q tq -p 5016 -t 1000 +q cx.q vwap -p 5017 -t 1000 +q cx.q show +``` +Create a feedhandler simulator to start data flowing into the system: +```q +q feed.q localhost:5010 -t 500 +``` -## Process examples +### Process examples -Set focus on the last window, and view the trade table. +Set focus on the RDB, and view the trade table. Note that each time the table is viewed, it will be updated with the latest data: ```q @@ -176,7 +142,7 @@ AMD | 14:36:03.405 23.21 94 1 W N ... ``` -Set focus on the vwap window, and view the `vwap` table. Note that `price` is actually `price*size`. This can be updated much more efficiently than storing actual prices and sizes. +Set focus on the VWAP window, and view the `vwap` table. Note that `price` is actually `price*size`. This can be updated much more efficiently than storing actual prices and sizes. ```q q)vwap @@ -241,6 +207,6 @@ upd:{[t;x].[t;();,;select by sym from x]}] ## More information -:fontawesome-brands-github: -[KxSystems/kdb/d/tick.htm](https://github.com/KxSystems/kdb/blob/master/d/tick.htm) +:fontawesome-regular-map: +[Streaming Architecture](../../architecture/index.md) From b052f278a14b416996ead56743bd285f504236c0 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Tue, 16 Jul 2024 11:49:40 +0100 Subject: [PATCH 15/40] remove links that are taking people off the site --- docs/architecture/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/index.md b/docs/architecture/index.md index c2c8d9627..4a99afb75 100644 --- a/docs/architecture/index.md +++ b/docs/architecture/index.md @@ -18,7 +18,7 @@ Certain kinds of process recur across applications. ### Data feed -This is a source of real-time data; for example, financial quotes and trades from [Bloomberg](https://www.bloomberg.com/professional/solution/content-and-data/) or [Refinitiv](https://www.refinitiv.com/), or readings from a network of sensors. +This is a source of real-time data; for example, financial quotes and trades from Bloomberg or Refinitiv, or readings from a network of sensors. ### Feedhandler From 24f4da8587b92a67b451fb15e5c5224ec5b12c53 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Tue, 16 Jul 2024 12:15:59 +0100 Subject: [PATCH 16/40] add encryption details to -21 --- docs/basics/internal.md | 60 +++++++++++++++++++++++-------------- docs/kb/dare.md | 2 +- docs/kb/file-compression.md | 2 +- 3 files changed, 40 insertions(+), 24 deletions(-) diff --git a/docs/basics/internal.md b/docs/basics/internal.md index 38c1ce92d..073bdeb34 100644 --- a/docs/basics/internal.md +++ b/docs/basics/internal.md @@ -10,25 +10,25 @@ description: The operator ! with a negative integer as left-argument calls an in The operator `!` with a negative integer as left argument calls an internal function.

-[0N!x](#0nx-show) show Replaced: -[-4!x](#-4x-tokens) tokens -1! [hsym](../ref/hsym.md) -[-8!x](#-8x-to-bytes) to bytes -2! [attr](../ref/attr.md) -[-9!x](#-9x-from-bytes) from bytes -3! [.Q.s1](../ref/dotq.md#s1-string-representation) -[-10!x](#-10x-type-enum) type enum -5! [parse](../ref/parse.md) -[-11!](#-11-streaming-execute) streaming execute -6! [eval](../ref/eval.md) -[-14!x](#-14x-quote-escape) quote escape -7! [hcount](../ref/hcount.md) -[-16!x](#-16x-ref-count) ref count -12! [.Q.host](../ref/dotq.md#host-hostname) -[-18!x](#-18x-compress-byte) compress byte -13! [.Q.addr](../ref/dotq.md#addr-ip-address) -[-21!x](#-21x-compression-stats) compression stats -15! [md5](../ref/md5.md) -[-22!x](#-22x-uncompressed-length) uncompressed length -19! [set](../ref/get.md#set) -[-23!x](#-23x-memory-map) memory map -20! [.Q.gc](../ref/dotq.md#gc-garbage-collect) -[-25!x](#-25x-async-broadcast) async broadcast -24! [reval](../ref/eval.md#reval) -[-26!x](#-26x-ssl) SSL -29! [.j.k](../ref/dotj.md#jk-deserialize) -[-27!(x;y)](#-27xy-format) format -31! [.j.jd](../ref/dotj.md#jjd-serialize-infinity) -[-30!x](#-30x-deferred-response) deferred response -32! [.Q.btoa](../ref/dotq.md#btoa-b64-encode) -[-33!x](#-33x-sha-1-hash) SHA-1 hash -34! [.Q.ts](../ref/dotq.md#ts-time-and-space) -[-36!](#-36-load-master-key) load master key -35! [.Q.gz](../ref/dotq.md#gz-gzip) -[-38!x](#-38x-socket-table) socket table -37! [.Q.prf0](../ref/dotq.md#prf0-code-profiler) +[0N!x](#0nx-show) show Replaced: +[-4!x](#-4x-tokens) tokens -1! [hsym](../ref/hsym.md) +[-8!x](#-8x-to-bytes) to bytes -2! [attr](../ref/attr.md) +[-9!x](#-9x-from-bytes) from bytes -3! [.Q.s1](../ref/dotq.md#s1-string-representation) +[-10!x](#-10x-type-enum) type enum -5! [parse](../ref/parse.md) +[-11!](#-11-streaming-execute) streaming execute -6! [eval](../ref/eval.md) +[-14!x](#-14x-quote-escape) quote escape -7! [hcount](../ref/hcount.md) +[-16!x](#-16x-ref-count) ref count -12! [.Q.host](../ref/dotq.md#host-hostname) +[-18!x](#-18x-compress-byte) compress byte -13! [.Q.addr](../ref/dotq.md#addr-ip-address) +[-21!x](#-21x-compressionencryption-stats) compression/encryption stats -15! [md5](../ref/md5.md) +[-22!x](#-22x-uncompressed-length) uncompressed length -19! [set](../ref/get.md#set) +[-23!x](#-23x-memory-map) memory map -20! [.Q.gc](../ref/dotq.md#gc-garbage-collect) +[-25!x](#-25x-async-broadcast) async broadcast -24! [reval](../ref/eval.md#reval) +[-26!x](#-26x-ssl) SSL -29! [.j.k](../ref/dotj.md#jk-deserialize) +[-27!(x;y)](#-27xy-format) format -31! [.j.jd](../ref/dotj.md#jjd-serialize-infinity) +[-30!x](#-30x-deferred-response) deferred response -32! [.Q.btoa](../ref/dotq.md#btoa-b64-encode) +[-33!x](#-33x-sha-1-hash) SHA-1 hash -34! [.Q.ts](../ref/dotq.md#ts-time-and-space) +[-36!](#-36-load-master-key) load master key -35! [.Q.gz](../ref/dotq.md#gz-gzip) +[-38!x](#-38x-socket-table) socket table -37! [.Q.prf0](../ref/dotq.md#prf0-code-profiler) [-120!x](#-120x-memory-domain) memory domain
@@ -211,10 +211,11 @@ q)get[`:test]~get`:ztest [`.z.zd` zip defaults](../ref/dotz.md#zzd-zip-defaults) --> -## `-21!x` (compression stats) +[](){#-21x-compression-stats} +## `-21!x` (compression/encryption stats) -Where `x` is a file symbol, returns a dictionary of compression statistics for it. -The dictionary is empty if the file is not compressed. +Where `x` is a file symbol, returns a dictionary of compression/encryption statistics for it. Encryption available since 4.0 2019.12.12. +The dictionary is empty if the file is not compressed/encrypted. ```q q)-21!`:ztest / compressed @@ -226,6 +227,18 @@ zipLevel | 6i q)-21!`:test / not compressed q)count -21!`:test 0 +q)-21!`:ztest / encrypted +compressedLength | 40088 +uncompressedLength| 40008 +algorithm | 16i +logicalBlockSize | 17i +zipLevel | 6i +q)-21!`:ztest / compressed and encrypted +compressedLength | 6504 +uncompressedLength| 40008 +algorithm | 18i +logicalBlockSize | 17i +zipLevel | 6i ``` :fontawesome-solid-book: @@ -233,6 +246,9 @@ q)count -21!`:test
:fontawesome-solid-database: [File compression](../kb/file-compression.md) +
+:fontawesome-solid-database: +[Data at rest encryption (DARE)](../kb/dare.md) ## `-22!x` (uncompressed length) diff --git a/docs/kb/dare.md b/docs/kb/dare.md index ac5d66af0..f7218ccc7 100644 --- a/docs/kb/dare.md +++ b/docs/kb/dare.md @@ -170,7 +170,7 @@ Or use [`.z.zd`](../ref/dotz.md#zzd-zip-defaults) for a process-wide default set When using the global setting `.z.zd`, files which do not qualify for encryption are filenames with an extension. e.g. `abc.bin`, `.d`. -Encryption adds a small amount of data, depending on the logical block size chosen, amounting to less than 2% of the overall size for typical DB files. The encoded size is reported via the command [`-21!filename`](../basics/internal.md#-21x-compression-stats). +Encryption adds a small amount of data, depending on the logical block size chosen, amounting to less than 2% of the overall size for typical DB files. The encoded size is reported via the command [`-21!filename`](../basics/internal.md#-21x-compressionencryption-stats). ## File locking diff --git a/docs/kb/file-compression.md b/docs/kb/file-compression.md index dfbe2470f..070de7d21 100644 --- a/docs/kb/file-compression.md +++ b/docs/kb/file-compression.md @@ -87,7 +87,7 @@ So files that do not compress well, or have an access pattern that does not perf ### Compression statistics -The [`-21!` internal function](../basics/internal.md#-21x-compression-stats) returns a dictionary of compression statistics, or an empty dictionary if the file is not compressed. +The [`-21!` internal function](../basics/internal.md#-21x-compressionencryption-stats) returns a dictionary of compression statistics, or an empty dictionary if the file is not compressed. [`hcount`](../ref/hcount.md) returns the uncompressed file length. From f8dd31cd88343d3aeb2655e8b248353b3f121431 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Tue, 16 Jul 2024 12:45:47 +0100 Subject: [PATCH 17/40] encryption details for .z.zd --- docs/basics/internal.md | 2 +- docs/kb/dare.md | 2 +- docs/kb/file-compression.md | 2 +- docs/ref/dotz.md | 13 +++++++++---- docs/ref/get.md | 2 +- docs/releases/ChangesIn4.0.md | 2 +- docs/wp/blockchain/index.md | 2 +- docs/wp/compress/index.md | 2 +- 8 files changed, 16 insertions(+), 11 deletions(-) diff --git a/docs/basics/internal.md b/docs/basics/internal.md index 073bdeb34..5054ac618 100644 --- a/docs/basics/internal.md +++ b/docs/basics/internal.md @@ -208,7 +208,7 @@ q)get[`:test]~get`:ztest [File compression](../kb/file-compression.md)
:fontawesome-solid-book: -[`.z.zd` zip defaults](../ref/dotz.md#zzd-zip-defaults) +[`.z.zd` zip defaults](../ref/dotz.md#zzd-compressionencryption-defaults) --> [](){#-21x-compression-stats} diff --git a/docs/kb/dare.md b/docs/kb/dare.md index f7218ccc7..57e59a327 100644 --- a/docs/kb/dare.md +++ b/docs/kb/dare.md @@ -160,7 +160,7 @@ Individual files can be encrypted as e.g. (`:ztest;17;16;6) set asc 10000?`3 / encrypt an individual file ``` -Or use [`.z.zd`](../ref/dotz.md#zzd-zip-defaults) for a process-wide default setting for all qualifying files. +Or use [`.z.zd`](../ref/dotz.md#zzd-compressionencryption-defaults) for a process-wide default setting for all qualifying files. ```q .z.zd:17 2 6 / zlib compression diff --git a/docs/kb/file-compression.md b/docs/kb/file-compression.md index 070de7d21..22d0cb79d 100644 --- a/docs/kb/file-compression.md +++ b/docs/kb/file-compression.md @@ -96,7 +96,7 @@ The [`-21!` internal function](../basics/internal.md#-21x-compressionencryption- kdb+ can write compressed files by default. -This is governed by the [zip defaults `.z.zd`](../ref/dotz.md#zzd-zip-defaults). +This is governed by the [zip defaults `.z.zd`](../ref/dotz.md#zzd-compressionencryption-defaults). Set this as an integer vector, e.g. ```q diff --git a/docs/ref/dotz.md b/docs/ref/dotz.md index 2d1376cd6..7a999a3ff 100644 --- a/docs/ref/dotz.md +++ b/docs/ref/dotz.md @@ -36,7 +36,7 @@ Environment Callbacks [.z.W/w handles/handle](#zw-handles) [.z.X/x raw/parsed command line](#zx-raw-command-line) [.z.Z/z local/UTC datetime](#zz-local-datetime) - [.z.zd zip defaults](#zzd-zip-defaults) + [.z.zd compression/encryption defaults](#zzd-compressionencryption-defaults) The `.z` [namespace](../basics/namespaces.md) contains environment variables and functions, and hooks for callbacks. @@ -1153,14 +1153,16 @@ q).z.z [`.z.Z` local datetime](#zz-local-datetime), [`.z.P` local timestamp](#zp-local-timestamp), [`.z.p` UTC timestamp](#zp-utc-timestamp) [`.z.N` local timespan](#zn-local-timespan), [`.z.n` UTC timespan](#zn-utc-timespan) -## `.z.zd` (zip defaults) +[](){#zzd-zip-defaults} +## `.z.zd` (compression/encryption defaults) ```syntax .z.zd:(lbs;alg;lvl) ``` -Integers `lbs`, `alg`, and `lvl` are [compression parameters](../kb/file-compression.md#compression-parameters). -They set default values for logical block size, compression algorithm and compression level that apply when saving to files with no file extension. +Integers `lbs`, `alg`, and `lvl` are [compression parameters](../kb/file-compression.md#compression-parameters) and/or [encryption parameters](../kb/dare.md#encryption). +They set default values for logical block size, compression/encryption algorithm and compression level that apply when saving to files with no file extension. +Encryption available since 4.0 2019.12.12. ```q q).z.zd:17 2 6 / set zip defaults @@ -1175,6 +1177,9 @@ q)\x .z.zd / clear zip defaults
:fontawesome-regular-map: [Compression in kdb+](../wp/compress/index.md) +
+:fontawesome-solid-database: +[Data at rest encryption (DARE)](../kb/dare.md) ## `.z.T` `.z.t` `.z.D` `.z.d` (time/date shortcuts) diff --git a/docs/ref/get.md b/docs/ref/get.md index 25ab1890c..f29436ffc 100644 --- a/docs/ref/get.md +++ b/docs/ref/get.md @@ -193,7 +193,7 @@ For the keys of `dic` are either column names of `t` or the null symbol `` ` ``. The value of each entry is an integer vector: `lbs`, `alg`, and `lvl`. -Compression for unspecified columns is specified either by an entry for the null symbol (as below) or by [`.z.zd`](dotz.md#zzd-zip-defaults). +Compression for unspecified columns is specified either by an entry for the null symbol (as below) or by [`.z.zd`](dotz.md#zzd-compressionencryption-defaults). ```q q)m1:1000000 diff --git a/docs/releases/ChangesIn4.0.md b/docs/releases/ChangesIn4.0.md index c55b085e6..7fbd5ad09 100644 --- a/docs/releases/ChangesIn4.0.md +++ b/docs/releases/ChangesIn4.0.md @@ -210,7 +210,7 @@ Files can then be compressed and/or encrypted using the same command as for file (`:ztest;17;2+16;6) set asc 10000?`3 / compress and encrypt to an individual file ``` -or use [`.z.zd`](../ref/dotz.md#zzd-zip-defaults) for process-wide default setting when writing files: +or use [`.z.zd`](../ref/dotz.md#zzd-compressionencryption-defaults) for process-wide default setting when writing files: ```q .z.zd:(17;2+16;6) / zlib compression, with aes256cbc encryption diff --git a/docs/wp/blockchain/index.md b/docs/wp/blockchain/index.md index 7e274c8e9..60be4480e 100644 --- a/docs/wp/blockchain/index.md +++ b/docs/wp/blockchain/index.md @@ -714,7 +714,7 @@ tables. To minimize on-disk memory, all tables are stored across partitioned databases in a compressed format. This was achieved by setting -[`.z.zd`](../../ref/dotz.md#zzd-zip-defaults) to a value of +[`.z.zd`](../../ref/dotz.md#zzd-compressionencryption-defaults) to a value of `17 2 6` prior to writing. ```q diff --git a/docs/wp/compress/index.md b/docs/wp/compress/index.md index 5a943d40d..01626233d 100644 --- a/docs/wp/compress/index.md +++ b/docs/wp/compress/index.md @@ -94,7 +94,7 @@ t:([]a:asc 1000000?10; b:asc 1000000?10; c:asc 1000000?10) ### Compression defaults -Rather than specifying the compression parameters individually every time `set` is called, we also have the option of defining default compression parameters which will be used if `set` is called the old-fashioned way, i.e. `` `:filename set table``. This is done by defining the [zip-defaults variable `.z.zd`](../../ref/dotz.md#zzd-zip-defaults). The format is the same as the non-filename arguments passed to `set`, e.g. +Rather than specifying the compression parameters individually every time `set` is called, we also have the option of defining default compression parameters which will be used if `set` is called the old-fashioned way, i.e. `` `:filename set table``. This is done by defining the [zip-defaults variable `.z.zd`](../../ref/dotz.md#zzd-compressionencryption-defaults). The format is the same as the non-filename arguments passed to `set`, e.g. ```q .z.zd:(17;2;6);`:zfile set asc 10000?`3 From a3f0b2a99507d7da23785ad746bb234ea91097e3 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Tue, 16 Jul 2024 14:38:10 +0100 Subject: [PATCH 18/40] encryption details for set --- docs/kb/file-compression.md | 2 +- docs/ref/get.md | 33 +++++++++++++++++++++------------ 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/docs/kb/file-compression.md b/docs/kb/file-compression.md index 22d0cb79d..728640e39 100644 --- a/docs/kb/file-compression.md +++ b/docs/kb/file-compression.md @@ -16,7 +16,7 @@ Q operators and keywords read both compressed and uncompressed files. ## Write compressed files Use [`set`](../ref/get.md#set) with a left argument that specifies the file or splay target, and the [compression parameters](#compression-parameters). -(For a splayed table, you can [specify the compression of each column](../ref/get.md#compression).) +(For a splayed table, you can [specify the compression of each column](../ref/get.md#compressionencryption).) ```q q)`:a set 1000#enlist asc 1000?10 / uncompressed file diff --git a/docs/ref/get.md b/docs/ref/get.md index f29436ffc..69ecd4ad3 100644 --- a/docs/ref/get.md +++ b/docs/ref/get.md @@ -73,16 +73,16 @@ Persist an object as a file or directory_ nam set y set[nam;y] /set global var nam fil set y set[fil;y] /serialize y to fil dir set t set[dir;t] /splay t to dir -(fil;lbs;alg;lvl) set y set[(fil;lbs;alg;lvl);y] /write y to fil, cmprssd -(dir;lbs;alg;lvl) set t set[(dir;lbs;alg;lvl);t] /splay t to dir, cmprssd -(dir;dic) set t set[(dir;dic);t] /splay t to dir, cmprssd +(fil;lbs;alg;lvl) set y set[(fil;lbs;alg;lvl);y] /write y to fil, compressed and/or encrypted +(dir;lbs;alg;lvl) set t set[(dir;lbs;alg;lvl);t] /splay t to dir, compressed and/or encrypted +(dir;dic) set t set[(dir;dic);t] /splay t to dir, compressed and/or encrypted ``` Where ```txt -alg integer atom compression algorithm -dic dictionary compression specifications +alg integer atom compression/encryption algorithm +dic dictionary compression/encryption specifications dir filesymbol directory in the filesystem fil filesymbol file in the filesystem lbs integer atom logical block size @@ -95,7 +95,10 @@ y (any) any q object :fontawesome-solid-database: [Compression parameters `alg`, `lbs`, and `lvl`](../kb/file-compression.md#parameters)
-[Compression specification dictionary](#compression) +:fontawesome-solid-database: +[Encryption parameters `alg` and `lbs`](../kb/dare.md#encryption) +
+[Compression/Encryption specification dictionary](#compressionencryption) Examples: ```q @@ -116,6 +119,9 @@ q)(`:ztbl;17;2;6) set t / serialize compressed q)(`:ztbl/;17;2;6) set t / splay table compressed `:ztbl/ + +q)(`:ztbl/;17;2+16;6) set t / splay table compressed and encrypted (since v4.0 2019.12.12) +`:ztbl/ ``` Anymap write detects consecutive deduplicated (address matching) top-level objects, skipping them to save space; since V4.1t 2021.06.04. @@ -166,17 +172,17 @@ q)read0 `:data/foo These are `.h`, `.j`, `.Q`, `.q`, `.z`, and any other namespaces with single-character names. - -### Compression +[](){#compression} +### Compression/Encryption For ```q -(fil;lbs;alg;lvl) set y / write y to fil, compressed -(dir;lbs;alg;lvl) set t / splay t to dir, compressed +(fil;lbs;alg;lvl) set y / write y to fil, compressed and/or encrypted +(dir;lbs;alg;lvl) set t / splay t to dir, compressed and/or encrypted ``` -Arguments `lbs`, `alg`, and `lvl` are [compression parameters](../kb/file-compression.md#compression-parametrers). +Arguments `lbs`, `alg`, and `lvl` are [compression parameters](../kb/file-compression.md#compression-parametrers) and/or [encryption parameters](../kb/dare.md#encryption). Splay table `t` to directory `ztbl/` with gzip compression: @@ -193,7 +199,7 @@ For the keys of `dic` are either column names of `t` or the null symbol `` ` ``. The value of each entry is an integer vector: `lbs`, `alg`, and `lvl`. -Compression for unspecified columns is specified either by an entry for the null symbol (as below) or by [`.z.zd`](dotz.md#zzd-compressionencryption-defaults). +Compression/encryption for unspecified columns is specified either by an entry for the null symbol (as below) or by [`.z.zd`](dotz.md#zzd-compressionencryption-defaults). ```q q)m1:1000000 @@ -221,3 +227,6 @@ q)(`:ztbl/;dic) set t / splay table compressed
:fontawesome-regular-map: [Compression in kdb+](../wp/compress/index.md) +
+:fontawesome-solid-database: +[Data at rest encryption (DARE)](../kb/dare.md) From 4467e7ce8c9c1a45510eee5828f4c5d01406df25 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Tue, 16 Jul 2024 14:56:16 +0100 Subject: [PATCH 19/40] add encrypted details to hcount --- docs/ref/hcount.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/ref/hcount.md b/docs/ref/hcount.md index 60cfed247..61ad256ac 100644 --- a/docs/ref/hcount.md +++ b/docs/ref/hcount.md @@ -22,11 +22,14 @@ q)hcount`:c:/q/test.txt 42 ``` -On a compressed file returns the size of the original uncompressed file. +On a compressed/encrypted file returns the size of the original uncompressed/unencrypted file. ---- :fontawesome-solid-book-open: [File system](../basics/files.md)
:fontawesome-solid-database: -[File compression](../kb/file-compression.md) \ No newline at end of file +[File compression](../kb/file-compression.md) +
+:fontawesome-solid-database: +[Data at rest encryption (DARE)](../kb/dare.md) From 4a7ac573b53f807f6c5a6e5f7d7d0c611968f13c Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Tue, 16 Jul 2024 15:45:44 +0100 Subject: [PATCH 20/40] mention encryption with file algorithm --- docs/basics/internal.md | 6 ------ docs/kb/file-compression.md | 2 ++ docs/ref/get.md | 2 +- docs/wp/compress/index.md | 2 +- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/docs/basics/internal.md b/docs/basics/internal.md index 5054ac618..df418efb1 100644 --- a/docs/basics/internal.md +++ b/docs/basics/internal.md @@ -233,12 +233,6 @@ uncompressedLength| 40008 algorithm | 16i logicalBlockSize | 17i zipLevel | 6i -q)-21!`:ztest / compressed and encrypted -compressedLength | 6504 -uncompressedLength| 40008 -algorithm | 18i -logicalBlockSize | 17i -zipLevel | 6i ``` :fontawesome-solid-book: diff --git a/docs/kb/file-compression.md b/docs/kb/file-compression.md index 728640e39..bc9feb7f1 100644 --- a/docs/kb/file-compression.md +++ b/docs/kb/file-compression.md @@ -76,6 +76,8 @@ alg algorithm level since !!! detail "Level 0 for `lz4hc` default compression; level>16 behaves the same as 16" +!!! note "Algorithm is also used to specifiy the [encryption](dare.md#encryption) algorithm which can be [used with compression](dare.md#compression-with-encryption)" + ### Selective compression diff --git a/docs/ref/get.md b/docs/ref/get.md index 69ecd4ad3..fbb9f5872 100644 --- a/docs/ref/get.md +++ b/docs/ref/get.md @@ -120,7 +120,7 @@ q)(`:ztbl;17;2;6) set t / serialize compressed q)(`:ztbl/;17;2;6) set t / splay table compressed `:ztbl/ -q)(`:ztbl/;17;2+16;6) set t / splay table compressed and encrypted (since v4.0 2019.12.12) +q)(`:ztbl/;17;16;6) set t / splay table encrypted (since v4.0 2019.12.12) `:ztbl/ ``` diff --git a/docs/wp/compress/index.md b/docs/wp/compress/index.md index 01626233d..20c94f1b6 100644 --- a/docs/wp/compress/index.md +++ b/docs/wp/compress/index.md @@ -48,7 +48,7 @@ where `alg` -: Compression algorithm: 0 (none), 1 (kdb+ IPC), or 2 (`gzip`) +: [Compression](../../kb/file-compression.md#compression-parameters) and/or [encryption](../../kb/dare.md#encryption) algorithm `level` From 6792e5e88648643f9b8ce919d7b054b4ebc7a2a5 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Tue, 16 Jul 2024 15:53:13 +0100 Subject: [PATCH 21/40] use 'file' instead of 'fil' in reference --- docs/ref/get.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/ref/get.md b/docs/ref/get.md index fbb9f5872..0654b15b5 100644 --- a/docs/ref/get.md +++ b/docs/ref/get.md @@ -70,12 +70,12 @@ _Assign a value to a global variable Persist an object as a file or directory_ ```{.syntax style="font-size: .8em"} -nam set y set[nam;y] /set global var nam -fil set y set[fil;y] /serialize y to fil -dir set t set[dir;t] /splay t to dir -(fil;lbs;alg;lvl) set y set[(fil;lbs;alg;lvl);y] /write y to fil, compressed and/or encrypted -(dir;lbs;alg;lvl) set t set[(dir;lbs;alg;lvl);t] /splay t to dir, compressed and/or encrypted -(dir;dic) set t set[(dir;dic);t] /splay t to dir, compressed and/or encrypted +nam set y set[nam;y] /set global var nam +file set y set[file;y] /serialize y to file +dir set t set[dir;t] /splay t to dir +(file;lbs;alg;lvl) set y set[(file;lbs;alg;lvl);y] /write y to file, compressed and/or encrypted +(dir;lbs;alg;lvl) set t set[(dir;lbs;alg;lvl);t] /splay t to dir, compressed and/or encrypted +(dir;dic) set t set[(dir;dic);t] /splay t to dir, compressed and/or encrypted ``` Where @@ -84,7 +84,7 @@ Where alg integer atom compression/encryption algorithm dic dictionary compression/encryption specifications dir filesymbol directory in the filesystem -fil filesymbol file in the filesystem +file filesymbol file in the filesystem lbs integer atom logical block size lvl integer atom compression level nam symbol atom valid q name From b6a494f7bfeea7b2e38328f5875bb2d6c3c19658 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Tue, 16 Jul 2024 16:18:55 +0100 Subject: [PATCH 22/40] parse replaced -5! --- docs/wp/market-fragmentation/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/wp/market-fragmentation/index.md b/docs/wp/market-fragmentation/index.md index bdb550b45..2587a4b3e 100644 --- a/docs/wp/market-fragmentation/index.md +++ b/docs/wp/market-fragmentation/index.md @@ -265,10 +265,10 @@ The final step is to aggregate by the originally supplied user `symList`. byClause:(enlist`sym)!enlist`origSymList; ``` -We then look up the multimarket rules for the columns we are interested in, use `-5!` to parse each string, and create a dictionary mapping each column name to its corresponding aggregation. This dictionary is required for the final parameter into the functional select. +We then look up the multimarket rules for the columns we are interested in, use [`parse`](../../ref/parse.md) to parse each string, and create a dictionary mapping each column name to its corresponding aggregation. This dictionary is required for the final parameter into the functional select. ```q -aggClause:columns!-5!'.cfg.multiMarketAgg[columns:params`columns] +aggClause:columns!parse each .cfg.multiMarketAgg[columns:params`columns] ``` `aggClause` is thus defined as: @@ -391,7 +391,7 @@ res:select volume:sum[size], vwap:wavg[size;price], range:max[price]-min[price], if[params[`multiMarketRule]~`multi; res:lj[res;`sym xkey select sym:symList, origSymList from extended_syms]; byClause:(enlist`sym)!enlist`origSymList; - aggClause:columns!-5!'.cfg.multiMarketAgg[columns:params`columns]; + aggClause:columns!parse each .cfg.multiMarketAgg[columns:params`columns]; res:0!?[res;();byClause;aggClause]; ]; :(`sym,params[`columns])\#0!res From e0326c7cfdea0f8673d982dd7f78977a0b03baf7 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Tue, 16 Jul 2024 16:21:53 +0100 Subject: [PATCH 23/40] .Q.s1 replaced -3! --- docs/basics/ipc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/basics/ipc.md b/docs/basics/ipc.md index 2d1059aec..4efe5b81d 100644 --- a/docs/basics/ipc.md +++ b/docs/basics/ipc.md @@ -294,7 +294,7 @@ Finer grained authorization can be implemented by tracking user information with ```q q)\p 5000 q)allowedFns:(`func1;`func2;`func3;+;-) / list of allowed function/ops to call -q)checkFn:{if[not x in allowedFns;'(-3!x)," not allowed"];} +q)checkFn:{if[not x in allowedFns;'(.Q.s1 x)," not allowed"];} q)validatePT:{if[0h=t:type x;if[(not 0h=type first x)&1=count first x;checkFn first x;];.z.s each x where 0h=type each x;];} q).z.pg:{if[10h=type x;x:parse x;];validatePT x;eval x} ``` From c3ce7df37fc31bd3cf38e1634ac021927ba395c1 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Tue, 16 Jul 2024 16:41:43 +0100 Subject: [PATCH 24/40] 'set' is used instead of -19! --- docs/wp/compress/index.md | 31 +++++-------------------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/docs/wp/compress/index.md b/docs/wp/compress/index.md index 20c94f1b6..4c2787011 100644 --- a/docs/wp/compress/index.md +++ b/docs/wp/compress/index.md @@ -23,36 +23,15 @@ All tests were run using kdb+ version 3.1 (2013.09.05) ## Compression options -There are two high-level approaches to saving on-disk data in compressed format. The first is a two-step approach: save data to disk in the regular uncompressed format using `set`, then convert it to a compressed format using the `-19!` operator. The second approach is to stream data directly from memory to compressed format on disk by modifying the left argument to `set`. - -:fontawesome-regular-hand-point-right: -Reference: [`set`](../../ref/get.md#set), -[`-19!`](../../basics/internal.md#-19x-compress-file) +There are two high-level approaches to saving on-disk data in compressed format. The first is a two-step approach: save data to disk in the regular uncompressed format using [`set`](../../ref/get.md#set), then convert it to a compressed format using `set`. The second approach is to stream data directly from memory to compressed format on disk by modifying the left argument to `set`. The first approach is useful for archiving existing historical data, or in cases where it is significantly faster to save the data to disk uncompressed, without the overhead of first compressing the data. In many other cases, it can be more convenient and/or performant to compress the data on the fly while saving. -### Converting saved data to compressed format using `-19!` - -The syntax of `-19!` is: - -```q --19! (`:sourceFile; `:targetFile; blockSize; alg; level) -``` - -where +### Converting saved data to compressed format using `set` -`blockSize` - -: is logical block size, a power of 2 between 12 and 20: page size or allocation granularity to 1MB (see note). This argument affects both compression speed and compression ratio: larger blocks can be slower and better compressed. - -`alg` - -: [Compression](../../kb/file-compression.md#compression-parameters) and/or [encryption](../../kb/dare.md#encryption) algorithm - -`level` - -: Compression level: for `gzip`, an integer between 0 and 9; else 0. +:fontawesome-regular-hand-point-right: +Reference: [`set`](../../ref/get.md#set) !!! tip "Logical block size" @@ -64,7 +43,7 @@ The various combinations of arguments will be discussed further in the following ```q `:/db/trade_uncompressed set trade --19! (`:/db/trade_uncompressed; `:/db/trade_compressed; 16; 1; 0) +(`:/db/trade_compressed; 16; 1; 0) set `:/db/trade_uncompressed ``` If this approach is used to compress data, it is preferable to have the source and target files on separate physical disks. This will reduce the number of disk seeks required to move the data iteratively in chunks. From 780d7d9848463d68c9a42c0659f9c65456a2fbfe Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Wed, 17 Jul 2024 12:11:28 +0100 Subject: [PATCH 25/40] add cross references to source of .z.D/.z.T/etc --- docs/ref/dotz.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/ref/dotz.md b/docs/ref/dotz.md index 7a999a3ff..4935a7f8b 100644 --- a/docs/ref/dotz.md +++ b/docs/ref/dotz.md @@ -1191,6 +1191,9 @@ Shorthand forms: .z.t `time$.z.z .z.d `date$.z.z ``` +:fontawesome-solid-hand-point-right: +[`.z.Z` local datetime](#zz-local-datetime), [`.z.z` UTC datetime](#zz-utc-datetime) + --- :fontawesome-solid-graduation-cap: From 71380e076e1a345dd35449806be17aa4c99df4e4 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Wed, 17 Jul 2024 17:43:59 +0100 Subject: [PATCH 26/40] fixed some broken links --- docs/basics/datatypes.md | 2 +- docs/basics/errors.md | 2 +- docs/basics/syscmds.md | 2 +- docs/ref/index.md | 4 ++-- docs/wp/rt-tick/index.md | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/basics/datatypes.md b/docs/basics/datatypes.md index 2dd6e2847..864331017 100644 --- a/docs/basics/datatypes.md +++ b/docs/basics/datatypes.md @@ -259,7 +259,7 @@ q)0w + 5 q)-0Wh -32767h - Integer promotion is documented for [Add](../../ref/add/#range-and-domains). + Integer promotion is documented for [Add](../ref/add.md#range-and-domains). Integer infinities diff --git a/docs/basics/errors.md b/docs/basics/errors.md index bab2eb98e..43a2b94a9 100644 --- a/docs/basics/errors.md +++ b/docs/basics/errors.md @@ -56,7 +56,7 @@ bad lambda [](){#badmsg} badmsg -: Failure in [IPC validator](../releases/ChangesIn2.7/#ipc-message-validator) +: Failure in [IPC validator](../releases/ChangesIn2.7.md#ipc-message-validator) bad meta data in file diff --git a/docs/basics/syscmds.md b/docs/basics/syscmds.md index da81beb16..6d40def99 100644 --- a/docs/basics/syscmds.md +++ b/docs/basics/syscmds.md @@ -338,7 +338,7 @@ There is no garbage since q uses reference counting. As soon as there are no ref During that return of memory, q checks if the capacity of the object is ≥64MB. If it is and `\g` is 1, the memory is returned immediately to the OS; otherwise, the memory is returned to the thread-local heap for reuse. -Executing [`.Q.gc[]`](../ref/dotq/#qgc-garbage-collect) additionally attempts to coalesce pieces of the heap into their original allocation units and returns any units ≥64MB to the OS. +Executing [`.Q.gc[]`](../ref/dotq.md#qgc-garbage-collect) additionally attempts to coalesce pieces of the heap into their original allocation units and returns any units ≥64MB to the OS. Since V3.3 2015.08.23 (Linux only) unused pages in the heap are dropped from RSS during `.Q.gc[]`. diff --git a/docs/ref/index.md b/docs/ref/index.md index 77789bcc8..0721489f0 100644 --- a/docs/ref/index.md +++ b/docs/ref/index.md @@ -60,9 +60,9 @@ author: Stephen Taylor `+ - * %`[Add](add.md), [Subtract](subtract.md), [Multiply](multiply.md), [Divide](divide.md) - `= <> ~`[Equals](../basics/comparison/#six-comparison-operators), [Not Equals](../basics/comparison/#six-comparison-operators), [Match](../basics/comparison/#match) + `= <> ~`[Equals](../basics/comparison.md#six-comparison-operators), [Not Equals](../basics/comparison.md#six-comparison-operators), [Match](../basics/comparison.md#match) -`< <= >= >`[Less Than](../basics/comparison/#six-comparison-operators), [Up To](../basics/comparison/#six-comparison-operators), [At Least](../basics/comparison/#six-comparison-operators), [Greater Than](../basics/comparison/#six-comparison-operators) +`< <= >= >`[Less Than](../basics/comparison.md#six-comparison-operators), [Up To](../basics/comparison.md#six-comparison-operators), [At Least](../basics/comparison.md#six-comparison-operators), [Greater Than](../basics/comparison.md#six-comparison-operators) `| &`[Greater (OR)](greater.md), [Lesser, AND](lesser.md) diff --git a/docs/wp/rt-tick/index.md b/docs/wp/rt-tick/index.md index 571d34c84..e891aa0e2 100644 --- a/docs/wp/rt-tick/index.md +++ b/docs/wp/rt-tick/index.md @@ -428,7 +428,7 @@ This line obtains the subset of tables in `t` that have the grouped attribute on .Q.hdpf[`$":",.u.x 1;`:.;x;`sym] ``` -[`.Q.hdpf`](../../ref/dotq/#qhdpf-save-table) is a high-level function which saves all in-memory tables to disk in partitioned format, empties them out and then instructs the HDB to reload. Its arguments at runtime here will be: +[`.Q.hdpf`](../../ref/dotq.md#qhdpf-save-table) is a high-level function which saves all in-memory tables to disk in partitioned format, empties them out and then instructs the HDB to reload. Its arguments at runtime here will be: argument | value | semantics ---------|-----------------------|---------- From 3392317ac7de54dc05b5e967d9af81c12889cd22 Mon Sep 17 00:00:00 2001 From: Simon Shanks <59612559+sshanks-kx@users.noreply.github.com> Date: Thu, 18 Jul 2024 15:44:34 +0100 Subject: [PATCH 27/40] Update docs/architecture/index.md Co-authored-by: natalietanner <142605282+natalietanner@users.noreply.github.com> --- docs/architecture/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/index.md b/docs/architecture/index.md index 4a99afb75..6a67c8eef 100644 --- a/docs/architecture/index.md +++ b/docs/architecture/index.md @@ -30,7 +30,7 @@ Multiple feed handlers can be used to gather data from a number of different sou KX’s [Fusion interfaces](../interfaces/index.md#fusion-interfaces) connect kdb+ to a range of other technologies, such as [R](../interfaces/r.md), Apache Kafka, Java, Python and [C](../interfaces/c-client-for-q.md). -### TP +### Tickerplant (TP) A TP (tickerplant) captures the initial data feed, writes it to the log file and [publishes](../kb/publish-subscribe.md) these messages to any registered subscribers. Aims for zero-latency. From 3cd5fb1b51111748adfab9cbfa8941b7f80cd9b6 Mon Sep 17 00:00:00 2001 From: Simon Shanks <59612559+sshanks-kx@users.noreply.github.com> Date: Thu, 18 Jul 2024 15:44:51 +0100 Subject: [PATCH 28/40] Update docs/architecture/index.md Co-authored-by: natalietanner <142605282+natalietanner@users.noreply.github.com> --- docs/architecture/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/index.md b/docs/architecture/index.md index 6a67c8eef..38d856960 100644 --- a/docs/architecture/index.md +++ b/docs/architecture/index.md @@ -62,7 +62,7 @@ This is the file to which the Tickerplant logs the q messages it receives from t [Linux production notes](../kb/linux-production.md) -### RDB +### Real-time database (RDB) A RDB (real-time database) subscribes to messages from the Tickerplant, stores them in memory, and allows this data to be queried intraday. From e289be3420ee3eabd74617c0ebf830175704a5d4 Mon Sep 17 00:00:00 2001 From: Simon Shanks <59612559+sshanks-kx@users.noreply.github.com> Date: Thu, 18 Jul 2024 15:45:44 +0100 Subject: [PATCH 29/40] Update docs/kb/logging.md Co-authored-by: natalietanner <142605282+natalietanner@users.noreply.github.com> --- docs/kb/logging.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/kb/logging.md b/docs/kb/logging.md index 8488da61d..80db19864 100644 --- a/docs/kb/logging.md +++ b/docs/kb/logging.md @@ -227,7 +227,7 @@ q)value each get `:logfile.2013.12.03 If successful, the number of chunks executed is returned. -If the end of the file is corrupt a `badtail` error is signalled, which may be partially [recovered](#replay-from-corrupt-logs). +If the end of the file is corrupt, a `badtail` error is signalled, which may be partially [recovered](#replay-from-corrupt-logs). In the event that the log file references an undefined function, the function name is signalled as an error. This can be confusing if the missing function name is `upd`, as it does not reflect the same situation as the license expiry `upd` error. e.g. From c9f92149c8fa863d7517f6722080e6bf1205f420 Mon Sep 17 00:00:00 2001 From: Simon Shanks <59612559+sshanks-kx@users.noreply.github.com> Date: Thu, 18 Jul 2024 15:45:58 +0100 Subject: [PATCH 30/40] Update docs/learn/startingkdb/tick.md Co-authored-by: natalietanner <142605282+natalietanner@users.noreply.github.com> --- docs/learn/startingkdb/tick.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/learn/startingkdb/tick.md b/docs/learn/startingkdb/tick.md index 4aa4ff6e9..3d94c83c2 100644 --- a/docs/learn/startingkdb/tick.md +++ b/docs/learn/startingkdb/tick.md @@ -130,7 +130,7 @@ q feed.q localhost:5010 -t 500 ### Process examples Set focus on the RDB, and view the trade table. -Note that each time the table is viewed, it will be updated with the latest data: +Note that each time the table is viewed, it is updated with the latest data: ```q q)trade From b1050d2315496e4fc0a0481329389ba444ab86e1 Mon Sep 17 00:00:00 2001 From: Simon Shanks <59612559+sshanks-kx@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:07:54 +0100 Subject: [PATCH 31/40] Update docs/architecture/index.md Co-authored-by: natalietanner <142605282+natalietanner@users.noreply.github.com> --- docs/architecture/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/index.md b/docs/architecture/index.md index 38d856960..79955dc31 100644 --- a/docs/architecture/index.md +++ b/docs/architecture/index.md @@ -106,7 +106,7 @@ A RTE is sometimes referred to as a RTS (real-time subscriber). -### HDB +### Historical database (HDB) A HDB (historical database) provides a queryable data store of historical data; for example, for creating customer reports on order execution times, or sensor failure analyses. From 4a78f867cea9e5df90ab09ccaa1c18997ef32f83 Mon Sep 17 00:00:00 2001 From: Simon Shanks <59612559+sshanks-kx@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:08:35 +0100 Subject: [PATCH 32/40] Update docs/kb/kdb-tick.md Co-authored-by: natalietanner <142605282+natalietanner@users.noreply.github.com> --- docs/kb/kdb-tick.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/kb/kdb-tick.md b/docs/kb/kdb-tick.md index b1b3a8726..ade675696 100644 --- a/docs/kb/kdb-tick.md +++ b/docs/kb/kdb-tick.md @@ -85,7 +85,7 @@ $ q chainedr.q :5010 -p 5111 ### Write-only RDB The default behavior of the RDB is to collect data to an in-memory database during the day and then to save it to disk as an historical partition at day end. -This makes sense if it’s actually queried during the day, but if the only reason for having an RDB is to be able to save the historical partition +This is acceptable if it’s actually queried during the day, but if the only reason for having an RDB is to be able to save the historical partition, the amount of memory required to keep the in-memory database can be excessive. It would make sense to write the data to disk during the day so that it’s ready for day-end processing, but with only a small memory footprint to build bulk updates. From ba36912fc29517a515f6ce63c89fa223a899ea03 Mon Sep 17 00:00:00 2001 From: Simon Shanks <59612559+sshanks-kx@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:09:07 +0100 Subject: [PATCH 33/40] Update docs/kb/logging.md Co-authored-by: natalietanner <142605282+natalietanner@users.noreply.github.com> --- docs/kb/logging.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/kb/logging.md b/docs/kb/logging.md index 80db19864..e6602a1ae 100644 --- a/docs/kb/logging.md +++ b/docs/kb/logging.md @@ -229,7 +229,7 @@ If successful, the number of chunks executed is returned. If the end of the file is corrupt, a `badtail` error is signalled, which may be partially [recovered](#replay-from-corrupt-logs). -In the event that the log file references an undefined function, the function name is signalled as an error. This can be confusing if the missing function name is `upd`, as it does not reflect the same situation as the license expiry `upd` error. e.g. +In the event that the log file references an undefined function, the function name is signalled as an error. This can be confusing if the missing function name is `upd`, as it does not reflect the same situation as the license expiry `upd` error. For example:. ```q / Continuing the above example From e3322c154f0d85fb99ccf529fe890262d79e04b8 Mon Sep 17 00:00:00 2001 From: Simon Shanks <59612559+sshanks-kx@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:10:32 +0100 Subject: [PATCH 34/40] Update docs/wp/intraday-writedown/index.md Co-authored-by: natalietanner <142605282+natalietanner@users.noreply.github.com> --- docs/wp/intraday-writedown/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/wp/intraday-writedown/index.md b/docs/wp/intraday-writedown/index.md index 2b842540b..5f95d593d 100644 --- a/docs/wp/intraday-writedown/index.md +++ b/docs/wp/intraday-writedown/index.md @@ -24,7 +24,7 @@ Tests performed using kdb+ version 3.1 2014.02.08 ## Standard tick setup -Most kdb+ users will be familiar with a [vanilla tick setup](../../architecture/index.md) which has a tickerplant (TP) receiving data and then logging it to disk and publishing to an in-memory realtime database (RDB) which keeps all of the current day’s data in memory. At the end of the day the RDB then commits this data to disk in a separate historical database (HDB) which stores all of this historical data. This means that the most recent data (and often most important) always has the fastest access time as it is stored in RAM. +A common kdb+ [vanilla tick setup](../../architecture/index.md), has a tickerplant (TP) receiving data and then logs it to disk, whilst publishing to an in-memory realtime database (RDB), which keeps all of the current day’s data in memory. At the end of the day, the RDB commits this data to disk in a separate historical database (HDB) that stores all of this historical data. This means that the most recent data (and often most important) always has the fastest access time as it is stored in RAM. The standard approach above can be limited by available RAM if daily data volumes grow too large. It is important to realize also that extra RAM is required to query the data, on top of what is required to keep it in memory. The extra amount required will vary depending on the different use cases and queries that are run on it. Consideration must also be given to other processes such as chained RDBs or HDBs which will need to share the resources on the server. From f8780099a258d535fdbf8d2b9cfc73b5102342b7 Mon Sep 17 00:00:00 2001 From: Simon Shanks <59612559+sshanks-kx@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:10:52 +0100 Subject: [PATCH 35/40] Update docs/wp/intraday-writedown/index.md Co-authored-by: natalietanner <142605282+natalietanner@users.noreply.github.com> --- docs/wp/intraday-writedown/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/wp/intraday-writedown/index.md b/docs/wp/intraday-writedown/index.md index 5f95d593d..7bb31911a 100644 --- a/docs/wp/intraday-writedown/index.md +++ b/docs/wp/intraday-writedown/index.md @@ -566,7 +566,7 @@ The `genQuery` function could easily be expanded and refined based on what type ### Limitations -This solution, of course, comes with its own drawbacks, namely added complexity in maintaining the data in the RDB and in creating the HDB partition. Also, querying the data will be much more complicated as result of the data being stored in a different format in memory and in the temporary directory. However, depending on the use case, the benefits may outweigh the drawbacks. +This solution, comes with some limitations, namely added complexity in maintaining the data in the RDB and in creating the HDB partition. Also, querying the data is much more complicated as result of the data being stored in a different format in memory and in the temporary directory. However, depending on the use case, the benefits may outweigh the drawbacks. ## Comparison of `w.q` and partitioned writedown From 2c56c3fceada708badef93ac0f2043529f179b99 Mon Sep 17 00:00:00 2001 From: Simon Shanks <59612559+sshanks-kx@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:13:30 +0100 Subject: [PATCH 36/40] Update docs/kb/kdb-tick.md Co-authored-by: natalietanner <142605282+natalietanner@users.noreply.github.com> --- docs/kb/kdb-tick.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/kb/kdb-tick.md b/docs/kb/kdb-tick.md index ade675696..b3e7e8844 100644 --- a/docs/kb/kdb-tick.md +++ b/docs/kb/kdb-tick.md @@ -113,9 +113,9 @@ e.g. $ q w.q :5010 :5012 ``` -The `-koe` or `-keeponexit` parameter governs the behavior when a `w.q` task is exited at user request i.e. `.z.exit` is called. -By default the data saved so far is deleted, as if the task were restarted it would be difficult to ensure it restarted from exactly the right place. -It’s easier to replay the log and (re)write the data. If the flag is provided (or the `KEEPONEXIT` global set to `1b`) the data will not be removed. +The `-koe` or `-keeponexit` parameter governs the behavior when a `w.q` task is exited at user request, when `.z.exit` is called. +By default, the data saved so far is deleted. If the task were restarted it would be difficult to ensure it restarted from exactly the right place. +It’s easier to replay the log and (re)write the data. If the flag is provided (or the `KEEPONEXIT` global set to `1b`) the data is not removed. :fontawesome-regular-map: [Intraday writedown solutions](../wp/intraday-writedown/index.md) From 4a75e48a202dc6a151123fdadfd572239adc29ae Mon Sep 17 00:00:00 2001 From: Simon Shanks <59612559+sshanks-kx@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:13:59 +0100 Subject: [PATCH 37/40] Update docs/kb/logging.md Co-authored-by: natalietanner <142605282+natalietanner@users.noreply.github.com> --- docs/kb/logging.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/kb/logging.md b/docs/kb/logging.md index e6602a1ae..134bb6559 100644 --- a/docs/kb/logging.md +++ b/docs/kb/logging.md @@ -19,7 +19,7 @@ Software or hardware problems can cause a kdb+ server process to fail, possibly Logging is enabled by using the [`-l` or `-L` command-line arguments](../basics/cmdline.md#-l-log-updates). -This example will require a file `trade.q` containing instructions to create a trade table: +This example requires a file `trade.q` containing instructions to create a trade table: ```q trade:([]time:`time$();sym:`symbol$();price:`float$();size:`int$()) ``` From 680ed005e1840f8c90f83ea3496aaed1ae55e31b Mon Sep 17 00:00:00 2001 From: Simon Shanks <59612559+sshanks-kx@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:14:20 +0100 Subject: [PATCH 38/40] Update docs/kb/logging.md Co-authored-by: natalietanner <142605282+natalietanner@users.noreply.github.com> --- docs/kb/logging.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/kb/logging.md b/docs/kb/logging.md index 134bb6559..1f940cb82 100644 --- a/docs/kb/logging.md +++ b/docs/kb/logging.md @@ -197,7 +197,7 @@ Streaming-execute over a file is used (for example in kdb+tick) to replay a log :fontawesome-solid-book-open: [`-11!` streaming execute](../basics/internal.md#-11-streaming-execute) -A logfile is just a list of lists, and each list is read in turn and evaluated by [`.z.ps`](../ref/dotz.md#zps-set) (which defaults to [`value`](../ref/value.md)). +A logfile is essentially a list of lists and each list is read in turn and evaluated by [`.z.ps`](../ref/dotz.md#zps-set) (which defaults to [`value`](../ref/value.md)). Here, for demonstration purposes, we manually create a logfile, and play it back through `-11!`. This is functionally equivalent to doing ``value each get `:logfile`` but uses far less memory. From 160e8cabf96a990ce5102a4793bb7edcd02453cf Mon Sep 17 00:00:00 2001 From: Simon Shanks <59612559+sshanks-kx@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:15:04 +0100 Subject: [PATCH 39/40] Update docs/kb/kdb-tick.md Co-authored-by: natalietanner <142605282+natalietanner@users.noreply.github.com> --- docs/kb/kdb-tick.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/kb/kdb-tick.md b/docs/kb/kdb-tick.md index b3e7e8844..023166d4f 100644 --- a/docs/kb/kdb-tick.md +++ b/docs/kb/kdb-tick.md @@ -99,9 +99,8 @@ is a potential replacement for the default RDB `w.q` connects to the tickerplant just like `r.q`, but it buffers up requests and, every `MAXROWS` records, writes the data to disk. At day end, remaining data is flushed to disk, the database is sorted (on disk) and then moved to the appropriate date partition within the historical database. -Note that it makes no sense to query the task running `w.q` as it will have a small (and variable-sized) selection of records. -Although it wouldn’t be difficult to modify it to keep say the last 5 minutes of data, -that sort of custom collection is probably better housed in a task running a [`c.q`](#cq)-like aggregation. +!!! Note It is not recommended to query the task running `w.q` as it contains a small (and variable-sized) selection of records. +Although it wouldn’t be difficult to modify it to keep the last 5 minutes of data, for example, that sort of custom collection is probably better housed in a task running a [`c.q`](#cq)-like aggregation. Syntax: ```bash From 24028bdef3edaef728f2aedf245706ceb9e2a125 Mon Sep 17 00:00:00 2001 From: Simon Shanks Date: Thu, 18 Jul 2024 16:32:48 +0100 Subject: [PATCH 40/40] changes due to review --- docs/architecture/index.md | 17 +++++++---------- docs/kb/kdb-tick.md | 2 +- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/docs/architecture/index.md b/docs/architecture/index.md index 79955dc31..7992e0f37 100644 --- a/docs/architecture/index.md +++ b/docs/architecture/index.md @@ -5,15 +5,12 @@ keywords: hdb, kdb+, q, rdb, tick, tickerplant, streaming --- # Architecture of kdb+ systems +A kdb-tick based archecture can be used to capture, process and analyse vasts amount of real-time and historical data. -_Applications that use kdb+ typically comprise multiple processes_ +The following diagram illustrates the components that are often found in a vanilla kdb-tick setup: ![architecture](../img/architecture.png) -The small footprint of the q interpreter, the [interprocess communication](../basics/ipc.md) baked into q, and the range of [interfaces](../interfaces/index.md) available make it straightforward to incorporate kdb+ into a multi-process application architecture. - -Certain kinds of process recur across applications. - ## Components ### Data feed @@ -32,7 +29,7 @@ KX’s [Fusion interfaces](../interfaces/index.md#fusion-interfaces) connect kdb ### Tickerplant (TP) -A TP (tickerplant) captures the initial data feed, writes it to the log file and [publishes](../kb/publish-subscribe.md) these messages to any registered subscribers. +A kdb+ processing acting as a TP (tickerplant) captures the initial data feed, writes it to the log file and [publishes](../kb/publish-subscribe.md) these messages to any registered subscribers. Aims for zero-latency. Includes ingesting data in batch mode. @@ -64,7 +61,7 @@ This is the file to which the Tickerplant logs the q messages it receives from t ### Real-time database (RDB) -A RDB (real-time database) subscribes to messages from the Tickerplant, stores them in memory, and allows this data to be queried intraday. +A kdb+ processing acting as a RDB (real-time database) subscribes to messages from the Tickerplant, stores them in memory, and allows this data to be queried intraday. At startup, the RDB sends a message to the tickerplant and receives a reply containing the data schema, the location of the log file, and the number of lines to read from the log file. It then receives subsequent updates from the TP as they are published. @@ -87,9 +84,9 @@ At end of day usually writes intraday data to the Historical Database, and sends [Intraday writedown solutions](../wp/intraday-writedown/index.md) -### RTE/RTS +### Real-time engine/subscriber (RTE/RTS) -A RTE (real-time engine) subscribes to the intraday messages and typically performs some additional function on receipt of new data – e.g. calculating an order book or maintaining a subtable with the latest price for each instrument. +A kdb+ processing acting as a RTE (real-time engine) subscribes to the intraday messages and typically performs some additional function on receipt of new data – e.g. calculating an order book or maintaining a subtable with the latest price for each instrument. A RTE is sometimes referred to as a RTS (real-time subscriber). !!! tip "Best practices for real-time subscribers" @@ -108,7 +105,7 @@ A RTE is sometimes referred to as a RTS (real-time subscriber). ### Historical database (HDB) -A HDB (historical database) provides a queryable data store of historical data; +A kdb+ processing acting as a HDB (historical database) provides a queryable data store of historical data; for example, for creating customer reports on order execution times, or sensor failure analyses. Large tables are usually stored on disk partitioned by date, with each column stored as its own file. diff --git a/docs/kb/kdb-tick.md b/docs/kb/kdb-tick.md index 023166d4f..7539f1ee7 100644 --- a/docs/kb/kdb-tick.md +++ b/docs/kb/kdb-tick.md @@ -96,7 +96,7 @@ is a potential replacement for the default RDB :fontawesome-brands-github: [KxSystems/kdb-tick/tick/r.q](https://github.com/KxSystems/kdb-tick/blob/master/tick/r.q). -`w.q` connects to the tickerplant just like `r.q`, but it buffers up requests and, every `MAXROWS` records, writes the data to disk. +`w.q` connects to the tickerplant, but buffers requests. Each time the number of records in the buffer is equal to `MAXROWS`, it will write the records to disk. At day end, remaining data is flushed to disk, the database is sorted (on disk) and then moved to the appropriate date partition within the historical database. !!! Note It is not recommended to query the task running `w.q` as it contains a small (and variable-sized) selection of records.