TimescaleDB में 1 ट्रिलियन मौसम डेटा लोड करना
(aliramadhan.me)- दुनिया भर के ऐतिहासिक मौसम बदलावों का तेज़ी से विश्लेषण करने के लिए ERA5 reanalysis डेटा को PostgreSQL/TimescaleDB में डालना ज़रूरी है, और चुने गए variables व grid के आधार पर इसका आकार लगभग 754 अरब rows बनता है
- ERA5 1940 से प्रति-घंटा resolution और 0.25-degree latitude/longitude grid देता है, लेकिन NetCDF संरचना में किसी एक बिंदु की लंबी time series extraction में भी 20–30 मिनट लग सकते हैं
- single-row
insertलगभग 3 हज़ार rows प्रति सेकंड तक पहुँचता है, इसलिए पूरा load करने में लगभग 8 साल लगेंगे; multi-rowinsertभी psycopg3 के साथ 25–30 हज़ार rows/second पर लगभग 10 महीने लेता है - PostgreSQL
copyऔर psycopg3cursor.copy()में CSV पहले से तैयार होने या न होने के आधार पर फ़र्क पड़ता है, और overhead सहित यह लगभग 100 हज़ार rows/second तक पहुँचता है, जिसे parallelization और tuning से और बढ़ाया जा सकता है - अगर डेटा सीधे dataframe से डालना हो तो psycopg3 से hypertable में direct copy सबसे उपयुक्त है; अगर CSV पहले से मौजूद हो तो
timescaledb-parallel-copyबेहतर है, और इस सिस्टम में 12–16 workers parallelization का अच्छा संतुलन लगते हैं
वैश्विक मौसम डेटा warehouse बनाना
- लक्ष्य ऐसा data warehouse बनाना है जिसमें दुनिया भर के ऐतिहासिक मौसम डेटा को query करके पहले से हो चुके climate change signals का विश्लेषण किया जा सके
- उदाहरण के तौर पर यह देखा जा सकता है कि Jakarta वास्तव में ज़्यादा गर्म हुआ है या तूफ़ान ज़्यादा आने लगे हैं, Chile कुल मिलाकर ज़्यादा गर्म हुआ है या बादल बढ़े हैं, और अलग-अलग क्षेत्रों में बदलाव किस रूप में दिख रहे हैं
- तेज़ global analysis के लिए data warehouse queries का तेज़ होना ज़रूरी है, और पहला कदम भारी मात्रा के डेटा को database में load करना है
- आधार के रूप में PostgreSQL इस्तेमाल किया गया है, time-based query acceleration के लिए TimescaleDB और आगे geospatial queries को तेज़ करने के लिए PostGIS एक promising विकल्प है
ERA5 reanalysis डेटा और 754 अरब rows का पैमाना
- वास्तविक मौसम observations की जगह ERA5 climate reanalysis डेटा इस्तेमाल किया गया है
- ऐतिहासिक observations कुछ क्षेत्रों और समय बिंदुओं पर sparse हो सकते हैं
- ERA5 observations के अनुरूप constrained climate model output है, और मौसम व climate research में व्यापक रूप से इस्तेमाल होता है
- ERA5 पूरी पृथ्वी को 0.25-degree resolution पर cover करता है और 1940 से hourly resolution में उपलब्ध है
- हर time snapshot में प्रति variable 727,080 values होती हैं
- grid points की संख्या 1,038,240 है, जिसमें 1,440 longitudes और poles सहित 721 latitudes शामिल हैं
- time और location के आधार पर index करने पर प्रति variable 753,836,544,000 rows, यानी लगभग 754 अरब rows बनती हैं
- load किए जाने वाले variables हैं: temperature, east-west और north-south 10m wind speed, total cloud cover, precipitation, और snowfall
- table में
time,location_id,latitude,longitudeऔर हर weather variable के columns रखे गए हैंlocation_idको latitude/longitude columns के साथ रखने का कारण आगे queries और indexes की benchmark testing करना है
NetCDF file structure कहाँ धीमी पड़ती है
- ERA5 NetCDF files में distribute होता है, और डेटा आमतौर पर daily, monthly, या yearly files में रखा जाता है
- time-based chunk structure किसी specific समय का डेटा देखने के लिए तेज़ और सरल है
- लेकिन किसी एक location की लंबी time series जैसे समय-आधारित pattern देखने हों, तो बहुत-सी files पढ़नी पड़ती हैं, इसलिए यह धीमा हो जाता है
- उदाहरण के लिए, एक location की temperature time series निकालने में 20–30 मिनट लग सकते हैं
- complex geospatial queries, खासकर time dimension वाली queries, धीमी और चलाने में कठिन हो जाती हैं
- xarray, dask, Pangeo जैसे tools गति बढ़ा सकते हैं, लेकिन प्रक्रिया फिर भी धीमी रहती है
insert: single-row से multi-row तक
- सबसे सरल तरीका
insertसे rows को एक-एक करके डालना है - single-row
insertके साथ कई तरह की लागत जुड़ी होती है- PostgreSQL statement को parse करता है, table/column names validate करता है, और execution plan बनाता है
- data integrity के लिए lock की ज़रूरत पड़ सकती है
- WAL(write-ahead logging) के लिए data buffer में लिखा जाता है
- फिर actual table disk area में data insert किया जाता है
- transaction commit होने पर बदलाव स्थायी बनते हैं
- Python में single-row insertion के लिए तीन तरीकों का benchmark किया गया
- pandas
df.to_sql()के साथchunksize=1 - psycopg3 की parameterized query
- SQLAlchemy की parameterized query
- pandas
- single-row insertion में psycopg3 थोड़ा आगे रहा और SQLAlchemy सबसे धीमा था
- TimescaleDB hypertable सामान्य PostgreSQL table से थोड़ा धीमा था
- सर्वोत्तम प्रदर्शन लगभग 3 हज़ार rows/second रहा, यानी पूरा डेटा डालने में लगभग 8 साल लगेंगे
- multi-row
insertएक statement में कई rows डालकर network round trips, parsing और planning cost घटाता है- psycopg3 लगभग 25–30 हज़ार rows/second के साथ सबसे तेज़ था
- pandas में dictionary-आधारित insertion, tuple की तुलना में धीमा हो सकता है
- SQLAlchemy में session management और SQL expression abstraction जैसे अतिरिक्त overhead हो सकते हैं
- फिर भी पूरा load करने में लगभग 0.8 साल, यानी क़रीब 10 महीने लगते हैं
copy: PostgreSQL का bulk loading path
- PostgreSQL
copyCSV या binary file से rows पढ़कर डालने की bulk loading सुविधा है - क्योंकि यह bulk loading के लिए optimized है, इसलिए parsing, planning और WAL usage को multi-row
insertसे बेहतर तरीके से संभालता है - दो paths की तुलना की गई
- NetCDF डेटा को पहले CSV में save करके फिर
copyसे load करना - CSV file बनाए बिना psycopg3
cursor.copy()के जरिए सीधे PostgreSQL में stream करना
- NetCDF डेटा को पहले CSV में save करके फिर
- अगर CSV file पहले से तैयार हो, तो
copyलगभग 400 हज़ार rows/second के insertion rate तक पहुँच सकता है - लेकिन CSV file लिखने या tuple generation का overhead जोड़ने पर
copyऔर psycopg3 दोनों लगभग 100 हज़ार rows/second तक आते हैं, जिसमें psycopg3 थोड़ा तेज़ है - इस गति पर भी पूरा डेटा load करने में लगभग 3 महीने लगते हैं
sustained ingest rate और parallel copy
- बहुत-सी rows डालते समय disk writes, WAL और table inserts के बीच I/O contention, autovacuum, और checkpoint जैसी bottlenecks आ सकती हैं
- लगभग 77.2 करोड़ rows को 744 batches में डालने वाले experiment में single worker पर बहुत बड़ी slowdown नहीं दिखी
copy csvमें बार-बार गिरावट दिखी और यह उतार-चढ़ाव के प्रति अधिक संवेदनशील था- psycopg3 अधिकांश समय तेज़ रहा
- सामान्य table और hypertable के बीच फ़र्क बड़ा नहीं था
- joblib के साथ कई
copyjobs या psycopg3 cursors को parallel चलाया गया - एक ही table में insertion ऐसा काम नहीं है जो बहुत अच्छी तरह parallelize हो, और प्रदर्शन आमतौर पर 16 workers के बाद plateau हो जाता है
pg_bulkload और timescaledb-parallel-copy
- PostgreSQL
copyके अलावा pg_bulkload और timescaledb-parallel-copy का भी benchmark किया गया - pg_bulkload default settings में तेज़ दिखता है, लेकिन यह default रूप से shared buffers को bypass करता है और WAL logging को skip करता है, इसलिए crash के बाद data recovery संभव न हो सकती है
fsyncबंद होने की समान condition में multiple workers वाला timescaledb-parallel-copy, pg_bulkload से बेहतर रहा- timescaledb-parallel-copy में workers की संख्या देकर parallel insertion किया जा सकता है
- शुरुआती performance अच्छी थी, लेकिन इस सिस्टम में 100 million rows से पहले ही bottleneck आ गया, insertion rate तेज़ी से गिरा और फिर लहरों की तरह recover हुआ
- sustained ingest rate सामान्य table में लगभग 600–700 हज़ार rows/second और hypertable में लगभग 300 हज़ार rows/second रहा
- pg_bulkload में workers की संख्या सीधे नहीं दी जाती, लेकिन
writer=paralleloption के जरिए reading, parsing, और writing में multiple threads का उपयोग किया जाता है
PostgreSQL tuning और durability trade-offs
- अतिरिक्त performance PostgreSQL की non-durable settings को adjust करके हासिल की जा सकती है
- मुख्य settings हैं
fsyncको बंद करना ताकि disk flush न हो, औरfull_page_writesको बंद करना ताकि partial page write protection न हो - ये settings crash की स्थिति में database integrity को जोखिम में डाल सकती हैं
- unlogged table WAL generate नहीं करता, इसलिए writes तेज़ होती हैं, लेकिन crash recovery के दौरान truncate हो सकता है
- बाद में इसे सामान्य logged table में बदलना पड़ता है और यह प्रक्रिया धीमी तथा single-threaded हो सकती है
- hypertable unlogged नहीं हो सकता, इसलिए अगर hypertable चाहिए तो अतिरिक्त conversion या migration करना होगा
अंतिम चयन: सीधे hypertable में डालना
- अगर अंतिम लक्ष्य hypertable है, तो पहले सामान्य table में load करके फिर hypertable में convert करने की बजाय सीधे hypertable में load करना तेज़ है
- लगभग 77.2 करोड़ rows को psycopg3
copyऔर 16 workers के साथ डालने वाले एक सरल test में hypertable direct insertion, सामान्य table insertion के बाद conversion से कम समय में पूरा हुआ- इस मामले में hypertable direct insertion को लगभग 80% समय लगा
- conversion/migration प्रक्रिया तेज़ नहीं थी और single-threaded जैसी लगी
- अनुशंसित तरीका यह है
- अगर dataframes से सीधे load करना हो, तो psycopg3 के साथ hypertable में direct
copy - अगर CSV files पहले से हों, तो
timescaledb-parallel-copyका उपयोग करें - इस सिस्टम में parallelization के लिए 12–16 workers उपयुक्त लगते हैं
- अगर dataframes से सीधे load करना हो, तो psycopg3 के साथ hypertable में direct
कुल benchmark निष्कर्ष और समय अनुमान
- protection settings चालू होने पर single worker के साथ, overhead सहित sustained ingest rate की ऊपरी सीमा इस hardware पर लगभग 140 हज़ार rows/second दिखती है
- कई workers के साथ psycopg3
copycursor का उपयोग करके protection settings बनाए रखते हुए sustained ingest rate लगभग 250 हज़ार rows/second तक बढ़ाई जा सकती है - insertion process बहुत कुशलता से parallelize नहीं होती, और 4–16 workers का दायरा उपयुक्त दिखता है
- अगर जोखिम स्वीकार कर
fsyncबंद किया जाए, तो psycopg3 के साथ लगभग 462 हज़ार rows/second की sustained rate मिल सकती है - pg_bulkload default रूप से
fsyncको disable करता है, इसलिए इसका उपयोग सावधानी से करना चाहिए - लगभग 462 हज़ार rows/second बनाए रखने पर करीब 754 अरब rows load करने में लगभग 20 दिन लगेंगे
code और benchmark environment
- ERA5 download, table creation, insert/copy, benchmark, और graph generation का code timescaledb-insert-benchmarks में उपलब्ध है
- हर benchmark के लिए एक नया Docker container शुरू किया गया ताकि environment consistent रहे
- Docker containers के बीच storage preserve नहीं की गई
- NetCDF और CSV files HDD से पढ़ी गईं
- database NVMe SSD पर store किया गया
- hardware configuration
- CPU: 2x 12-core Intel Xeon Silver 4214
- RAM: 16x 16 GiB Samsung ECC DDR4 2666 MT/s
- SSD: Intel 2 TB NVMe
- HDD: Seagate Exos X16 14TB 7200 RPM
- software configuration
- Ubuntu 20.04, Linux kernel 5.15
- PostgreSQL 15.5
- TimescaleDB 2.13.0
- pg_bulkload 3.1.20
- PostgreSQL settings में
timescaledb-tuneद्वारा 250.57GB memory और 48 CPU के आधार पर सुझाए गए values का उपयोग किया गया, और benchmarks में WAL size को अलग से adjust किया गया
2 टिप्पणियां
GN+ की राय में सम्मानसूचक भाषा है..?
Hacker News की रायें
काम के सिलसिले में मैंने geospatial analysis काफी किया है, और geospatial data उम्मीद से कहीं ज़्यादा सूक्ष्म होता है, क्योंकि coordinate reference system (CRS) और visualization projection को ठीक से समझना पड़ता है
अगर metadata को data के साथ सही ढंग से ले जाने वाला infrastructure न हो, तो CRS की वजह से लगातार बेचैनी बनी रहती है
AWS की संबंधित सुविधाएँ, Postgres/PostGIS, Spark/Databricks, Snowflake, Trino, ArcGIS—सब इस्तेमाल किए हैं, लेकिन बड़े पैमाने के geospatial काम के लिए मुझे Google BigQuery साफ तौर पर बेहतर लगता है
विशाल m6a EC2 पर PostGIS में जिन queries में कई घंटे लगते थे और लागत भी काफी आती थी, वे BigQuery के free tier में 5 सेकंड से भी कम में हो गईं
मैंने FEMA public data इस्तेमाल किया था; Snowflake और AWS services geometry column के maximum byte size से आगे निकलने पर अटक गए, Spark में geospatial data type ही नहीं है और open-source extensions भी कमजोर लगे
on-premises हो तो स्थिति अलग हो सकती है, लेकिन 20TB के हिसाब से BigQuery storage cost भी शायद $100/माह से कम रहेगी, इसलिए मैं इसे खुद operate नहीं करना चाहूँगा
शुरुआत में H3 index इस्तेमाल किया था और intermediate datasets पूरी तरह memory में आ जाते थे, इसलिए यह संभव हुआ
setup था 128GB Mac Studio + Asahi Linux + mmap parquet files + DuckDB; Airflow भी चलाया, और Nix का इस्तेमाल developer builds तेज करने और data team की Airflow jobs चलाने में भी किया
GCP जब free या सस्ता हो तो अच्छा है, लेकिन usage न बढ़े तब भी किसी मोड़ पर बड़ा bill देकर चौंका सकता है
क्या आपने Apache Sedona से तुलना की थी, और具体 तौर पर क्या कमी लगी, यह जानना चाहूँगा
मैं Wherobots में काम करता हूँ, जिसे Apache Sedona के creators ने शुरू किया है, इसलिए feedback सुनना चाहता हूँ
https://sedona.apache.org/latest/
https://wherobots.com/
मैं मानता हूँ कि बहुत चौड़े columns कई tools को तोड़ देते हैं, लेकिन दूसरे column-oriented Postgres derivatives शायद बिना समस्या support कर पाएँगे
हैरानी है कि आपने BigQuery के सीधे competitor Redshift को इस्तेमाल नहीं किया; Redshift का
supercolumn BigQuery की maximum limit से भी बड़ा रखा जा सकता हैमैंने अक्सर देखा है कि लोग मुश्किल तरीके से यह समझते हैं कि PostGIS को हराना आसान नहीं है
Trino/Presto और Spark का इस क्षेत्र में ठहर जाना भी खास तौर पर बहुत कुछ बताता है
Postgres में बड़े tables के कुछ हिस्से cache किए थे और BigQuery में शुरुआत से फिर से बनाया था, फिर भी ऐसा हुआ
self-host किए जा सकने वाले tools में मुझे Postgres ज़्यादा पसंद है, लेकिन performance का एक digit multiple से भी ज़्यादा बेहतर होना नकारना मुश्किल है
वाकई शानदार लेख है
मैं Timescale में DevRel संभालता हूँ, और community से ऐसा अच्छी तरह लिखा गया लेख देखना अच्छा लगता है
hypertable के धीमे होने की एक वजह लगभग निश्चित रूप से यह है कि वह timestamp column पर default रूप से index बनाता है
सामान्य table में index नहीं था, इसलिए वह तेज रहा होगा
create_hypertableमेंcreate_default_indexes=>falseइस्तेमाल करें तो index creation skip कर सकते हैं, और data डालने से पहले index delete भी किया जा सकता हैआखिरकार वह index चाहिए होगा, लेकिन ऐसे bulk load में loading के बाद उसे एक साथ बनाना बेहतर रहता है
यह भी जानना चाहूँगा कि इतनी high-parallelism configuration में data पढ़ने वाला HDD कितना संभाल पाया
create_default_indexes=>falseहोता है और hypertable default रूप से time index बनाता है; इस हिस्से को समझाने वाली comment जोड़ूँगाtime index के बिना insert करके फिर manually index बनाने का benchmark भी करना चाहूँगा
32 workers पर भी HDD ठीक लग रहा था
btop में disk usage देखते समय लगा कि Postgres वाला SSD, HDD की तुलना में bottleneck के ज़्यादा करीब था, इसलिए मैंने निष्कर्ष निकाला कि data को HDD से SSD पर ले जाने की बजाय Postgres के लिए SSD को तेज वाले से बदलना बेहतर investment होगा
समझ नहीं आता कि इसे ऐसा करने की ज़रूरत ही क्यों है
ERA5 सहित ज़्यादातर weather और climate datasets नियमित latitude-longitude grid पर काफ़ी structured होते हैं
भले ही आप किसी खास location की time series ही निकाल रहे हों, ऐसे datasets की ताकत उनकी अंतर्निहित spatiotemporal structure और context में होती है; और अगर मकसद सिर्फ़ point time series निकालना नहीं है, तो उस structure को पूरी तरह तोड़ देना ज़्यादा समझदारी नहीं लगता
यहां तक कि केवल point time series निकालने के मामले में भी, उदाहरण के लिए समुद्र के बीचोंबीच surface temperature time series जैसी चीज़ शायद ही कभी काम आएगी, इसलिए आप data को काफी आक्रामक तरीके से घटाना चाहेंगे
ERA5 जैसे datasets के research और operational उपयोगों में ज़्यादातर मामलों के लिए Google Public Datasets के ARCO-ERA5 जैसे मूल structure को बचाए रखने वाले cloud-optimized replicas ज़्यादा उपयुक्त लगते हैं
ऐसे versions मूल structure बनाए रखते हुए cloud storage में बड़े पैमाने पर parallel access के लिए chunks में बांटते हैं
अपने career में मैंने लगभग हर मामले में देखा है कि Zarr-based सामान्य chunking वाला archive ही दिलचस्प अधिकतर use cases के लिए पर्याप्त तेज़ होता है
https://cloud.google.com/storage/docs/public-datasets/era5
हालांकि rabernat ने जैसा कहा, cloud replica से लंबी time series निकालना भी धीमा है
आखिरकार मैं 1940~1980 के Chile summer temperatures के 99th percentile की गणना जैसे जटिल spatiotemporal queries भी करना चाहता हूं
मुझे शक नहीं कि cloud replica तेज़ हो सकता है, लेकिन यह $0 budget से टकराता है
यह spatial queries के लिए optimized है, time series queries के लिए नहीं
मैंने अभी benchmark चलाया, और एक point की single variable time series लाने में 20 मिनट लगे
यह अच्छी तरह दिखाता है कि अगर expected usage pattern time series है, तो time-series-optimized chunking ज़रूरी है
कुछ labs के पास पहले से public algorithms और data से जुड़ी RDBMS-based pipelines हैं, और कोई भी उन्हें फिर से implement नहीं करना चाहता, न ही उसके लिए budget है
हमें मिला सबसे अच्छा सुधार बस पुराने MySQL से Postgres + PostGIS पर shift करना था
Timescale भी शायद मददगार होता
privacy, cluster access, budget जैसी वजहों से local पर चलाने के कारण भी थे
अच्छा लेख है
मेरे हिसाब से यहां जो चीज़ छूट गई है, वह यह analysis है कि weather data को relational database में ले जाने से हासिल क्या होता है
motivation query speed बढ़ाना है, लेकिन baseline क्या है, यह चाहिए
Xarray और Zarr maintainer तथा https://earthmover.io/ के founder के रूप में मैं इस technology landscape से काफी परिचित हूं; Zarr में data को सही तरह chunk किया जाए तो serverless solution + object storage भर से weather data की time series queries sub-second latency में handle की जा सकती हैं
लेख में बताए गए 30 मिनट से यह बहुत तेज़ है
इस लेख में दिखी data loading की कठिनाई को देखते हुए, RDBMS route पर जाने से पहले ऐसे solution का गंभीरता से मूल्यांकन करना उचित होगा
आगे API लगाकर उसे query जैसा बनाया जा सकता है
यह भी सही है कि RDBMS approach को पर्याप्त रूप से justify नहीं किया गया
Postgres + Timescale पर जाने की मुख्य वजह यह थी कि मैं इन्हें सीखना चाहता था, और ERA5 data के साथ experiment करना सबसे मज़ेदार लग रहा था
weather data इतना बड़ा है कि challenge बन सके, इसमें भी शायद आकर्षण था
मेरे पास evidence नहीं है, लेकिन यह जानने की उत्सुकता है कि अच्छी तरह tuned और indexed TimescaleDB + PostGIS, 1940~1980 के Chile summer temperatures के 99th percentile जैसी जटिल spatiotemporal queries में मदद करेगा या नहीं
क्योंकि इस case में कई Zarr chunks पढ़ने पड़ सकते हैं
ऐसे statistics cache करने के लिए अलग table रखने का idea भी मुझे पसंद है, हालांकि Zarr से भी यह इतना मुश्किल नहीं है
अगली बार queries और indexes का benchmark करने वाला हूं, तो शायद और पता चलेगा
लगता है कि एक fundamental tension है: बड़े chunks wide-area visualization और large queries के लिए अच्छे हैं, जबकि छोटे chunks point-based या time series queries के लिए अच्छे हैं
ऐसे बड़े geospatial datasets को अलग-अलग chunking versions में अलग से रखना संभव है, लेकिन cost-efficient नहीं है
सुना है कि दोनों के फायदे पाने के लिए
kerchunkइस्तेमाल किया जाता है, लेकिन ऐसा करने पर data compression choices खो जाती हैं और complexity भी काफी बढ़ जाती है, ऐसा मुझे लगता हैकई use cases के बीच balance कैसे रखना बेहतर होगा, यह जानने की उत्सुकता है
यहां संदर्भित Postgres bulk load दस्तावेज़ में मैंने योगदान दिया था; यह कई तकनीकों का अच्छा अवलोकन करता है
OpenStreetMap डेटाबेस की loading तेज़ करने के लिए मैंने इस तरह का काम काफ़ी किया है, और आख़िरी सार्वजनिक update presentation https://www.youtube.com/watch?v=BCMnu7xay2Y पर है
उसके बाद hardware में सुधार, PG15 के GIS improvements, और osm2pgsql द्वारा middle-way-node-index-id-shift तकनीक अपनाने की वजह से planet set की loading time 4 घंटे से नीचे आ गई
लेखक के लिए एक सुझाव: कुछ experiments pg_bulkload और COPY के ज़रिए अप्रत्यक्ष रूप से WAL writes को हटा रहे हैं
Craig Ringer ने linked SO post लिखी थी, उस समय यह documented नहीं था, लेकिन settings में WAL को सीधे बंद किया जा सकता है
बेशक crash हुआ तो current table खो जाएगी, और अगर job में कई हफ्ते लगें तो ऐसा हो सकता है
लेकिन time-series data में loading structure सही बनाया जाए तो सिर्फ़ आख़िरी chunk खोना मुश्किल नहीं है
bulk load के लिए WAL data असल में ज़रूरी नहीं होता
crash हो तो loaded data के right edge को clean up करके फिर से शुरू कर दें
WAL और अन्य overhead बंद करने के लिए मैं ये
postgresql.confsettings इस्तेमाल करता हूं:wal_level = minimalmax_wal_senders = 0synchronous_commit = offfsync = offfull_page_writes = offautovacuum = offcheckpoint_timeout = 60minआखिर में, बड़े chunks में load करते समय vacuum work कम करने के लिए आम तौर पर ऊपर की तरह autovacuum बंद करता हूं, और अभी load हो रहे date partition के पीछे-पीछे periodic रूप से
VACUUM FREEZEचलाता हूंयह सामान्य PG के लिए है, और database को उन कुछ कामों को skip करने देता है जिनमें वह इस intermediate stage की परवाह करता है कि नए transactions लिखे जा चुके हैं लेकिन अभी सबको visible नहीं हैं
खासकर chunk-based loading में bulk load के लिए WAL data सचमुच ज़रूरी नहीं है—यह किसी expert से सुनकर अच्छा लगा
मेरे पास अभी UPS नहीं है, लेकिन उम्मीद है कि data load में लगने वाले करीब 20 दिन बिना power cut के निकल जाएंगे; worst case में भी शायद बस आगे से continue कर दूंगा
अगर OP ही लेखक हैं, तो लगभग 4 साल पहले किया गया मेरा मिलता-जुलता experiment भी दिलचस्प हो सकता है
वही dataset, वही target, और मिलते-जुलते goals थे
https://rdrn.me/optimising-sql/
investigation flow काफ़ी मिलता-जुलता है, लेकिन Timescale की जगह plain Postgres इस्तेमाल किया था, और मेरी configuration में data पहले से memory में है यह मानकर binary data की direct copy से COPY की तुलना में करीब 3x तेज़ी मिली
मैंने footnote में लिखा है कि binary COPY क्यों try नहीं किया; मूल वजह यह थी कि किसी और ने इसका performance निराशाजनक बताया था
फिर भी लगता है इसे खुद try करना चाहिए
https://aliramadhan.me/2024/03/31/trillion-rows.html#fn:copy-binary-note
margin notes वाला format भी अच्छा लगा
numpy structured arrays को Postgres binary में लिखने वाला function देने से मदद मिली; पहले मैं यह figure out नहीं कर पाया था
“क्या gridded weather data के लिए relational database सही fit है? पता नहीं, लेकिन करके देखेंगे तो पता चलेगा।”
यह attitude अच्छा है
दूसरे mainstream tech articles के “असल बात तो यह है” वाले style से बिल्कुल उल्टा है, इसलिए पसंद आया
journey के दौरान reader को आखिर तक बांधे रखने वाली बात भी अच्छी है
मैंने काफी search किया लेकिन अपने use case के लिए कोई निर्णायक जवाब नहीं मिला, इसलिए खुद benchmark चलाने का फैसला किया
दिलचस्प लेख है
“लगातार करीब 462k inserts/sec हो तो लगभग 754 billion rows में करीब 20 दिन लगेंगे, जो बुरा नहीं लगता। यह post लिखने में लगे समय से कम है।” वाला हिस्सा मज़ेदार है
मैं भी लंबे और गहरे blog posts लिखने की तरफ झुक रहा हूं, इसलिए इस बात से सहमत हूं कि इसमें उम्मीद से ज्यादा मेहनत लगती है
अगर आप SQL query से सीधे time-series chart या कई charts बनाना चाहते हैं, तो qStudio एक free SQL IDE है और TimescaleDB समेत कई DBs के साथ काम करता है
https://www.timestored.com/qstudio/database/timescale
disclaimer: यह tool मैंने बनाया है
सोच रहा हूं कि शायद Timeplus support जोड़ा जा सके
Timeplus, ClickHouse-based streaming-first database है, और इसका core DB engine Timeplus Proton open source है
qStudio भी open source है और Java में लिखा है, इसलिए नए RDBMS support के लिए JDBC driver चाहिए लगता है
अगर सही समझ रहा हूं, तो Timeplus Proton के पास ClickHouse driver पर आधारित, streaming use case के लिए modifications वाला open-source JDBC driver है
https://www.timeplus.com/
https://github.com/timeplus-io/proton
https://github.com/timeseries/qstudio
https://github.com/timeplus-io/proton-java-driver
अभी तक केवल data insertion किया है, लेकिन जल्द ही queries और plotting try करूंगा
मैं भी ERA5 reanalysis data इस्तेमाल करता/करती हूँ और तेज़ time series की ज़रूरत होती है
डेटा चुनी गई अवधि के हिसाब से जमा हुए
[lat, lon]grid के रूप में आता है, जैसे[एक महीने का hourly data, lat, lon], इसलिए अगर 20 साल से ज़्यादा चाहिए तो यह एक बहुत बड़ी matrix transpose समस्या बन जाती हैमेरा तरीका है कि हर netCDF file डाउनलोड करता/करती हूँ, उसे transpose करता/करती हूँ, फिर
[lat, lon, hour]से बने एक विशाल 3D HDF file में डाल देता/देती हूँमेरे workstation पर एक variable का 1 साल का data बनाने में करीब 30 मिनट लगते हैं, लेकिन उसके बाद किसी single
(lat, lon)location को fetch करना milliseconds में हो जाता हैयह पहले मेहनत करके लंबे समय में फायदा लेने वाला तरीका है
तरीका सरल है, लेकिन मैं database expert नहीं, बस एक climatologist हूँ
लगता है कि यहाँ comment करने वाले rabernat और open-meteo भी मिलते-जुलते तरीके इस्तेमाल करते हैं और उसे तेज़ मानते हैं