<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: RMarcus</title><link>https://news.ycombinator.com/user?id=RMarcus</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 30 Apr 2026 17:51:55 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=RMarcus" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by RMarcus in "Zed 1.0"]]></title><description><![CDATA[
<p>I've got emacs keybinds in my muscle memory and Zed works well for me, although there's no kill ring and the macro system is nothing like emacs. The former will be added at some point (there's an open PR), but I do not expect the latter will ever be comparable.</p>
]]></description><pubDate>Wed, 29 Apr 2026 14:58:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=47949360</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=47949360</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47949360</guid></item><item><title><![CDATA[New comment by RMarcus in "Pg_parquet: An extension to connect Postgres and parquet"]]></title><description><![CDATA[
<p>This is awesome, thanks for creating this. I've had to write some absolutely wonky scripts to dump a PostgreSQL database into Parquet, or read a Parquet file into PostgreSQL. Normally some terrible combination of psycopg and pyarrow, which worked, but it was ad-hoc and slightly different every time.<p>A lot of other commenters are talking about `pg_duckdb` which maybe also could've solved my problem, but this looks quite simple and clean.<p>I hope for some kind of near-term future where there's <i>some</i> standardish analytics-friendly data archival format. I think Parquet is the closest thing we have now.</p>
]]></description><pubDate>Fri, 18 Oct 2024 03:46:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=41876178</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=41876178</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41876178</guid></item><item><title><![CDATA[New comment by RMarcus in "Zen5's AVX512 Teardown and More"]]></title><description><![CDATA[
<p>Looks like he got a master's degree from UIUC and did some research on FFT implementations. Seems to have been successful. What makes you say he was 'considered a "bad student"'?<p>(This is a genuine question. I've never met Alex in person, but if an applicant to my lab spent their free time diving into SIMD implementations and breaking records for computing mathematical constants, I'd rush to hire them. Not that either of those two things is a requirement, of course.)</p>
]]></description><pubDate>Wed, 07 Aug 2024 18:30:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=41184000</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=41184000</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41184000</guid></item><item><title><![CDATA[New comment by RMarcus in "Overflow in consistent hashing (2018)"]]></title><description><![CDATA[
<p>Depends!<p>If you double the number of keys and you double the number of bins (load factor stays constant), then the problem becomes <i>much worse</i> very quickly.<p>If you double the number of keys and you double the <i>size</i> of each bin (load factor stays constant), then the problem diminishes as you suggest. BUT, larger bins are more sensitive to changes in load factor.<p>The sibling comment ( <a href="https://news.ycombinator.com/item?id=40415826">https://news.ycombinator.com/item?id=40415826</a> ) does a good job of summarizing how post-2018 systems handle this issue.</p>
]]></description><pubDate>Mon, 20 May 2024 14:49:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=40416132</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=40416132</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40416132</guid></item><item><title><![CDATA[New comment by RMarcus in "Overflow in consistent hashing (2018)"]]></title><description><![CDATA[
<p>This is my post from 2018 (I didn't submit it to HN), and it could definitely use a "here's what practical systems do" update! I'll put it on the TODO list...<p>Your point about systems dealing with a relatively small number of large objects vs. small objects also makes sense: this is essentially the "cost" of an overflow (4kb spills once in a blue moon? Oh well, handle that as a special case. 4TB spills once in a blue moon? The system might crash). This is more obvious, as you also point out, in load balancing.<p>One aspect I found very counter-intuitive: before this investigation, I would've guessed that having a large number of large bins makes overflow increasingly unlikely. This is only partially true: more bins is obviously good, but larger bins are actually <i>more</i> sensitive to changes in load factor!<p>Overall, I think you are right that this is not really a concern in modern systems today. Compared to Dynamo, I still think Vimeo's solution (linked at the bottom of the post) is both intuitive and low-complexity. But regardless, more of an interesting mathematical diversion than a practical systems concern these days.</p>
]]></description><pubDate>Mon, 20 May 2024 14:45:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=40416079</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=40416079</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40416079</guid></item><item><title><![CDATA[New comment by RMarcus in "Ten years of improvements in PostgreSQL's optimizer"]]></title><description><![CDATA[
<p>I'm curious to hear a bit more of your opinion. For example, I'm surprised that syscall latency is something near the top of your list. I think the usual wisdom in the DB community is that the cost models are mostly fine, but the cardinality estimation is really bad.<p>In terms of the deferred / alternative planning, do you think adaptive query execution is a reasonable way to achieve this? It certainly allows for information early in the query execution to impact later plans. My worry with these approaches is that if you get the first couple of joins wrong (which is not uncommon), unless you have something like Yannakakis/SIPs, you still can't recover.<p>I am obviously biased on the whole "ML for query optimization" thing. One thing I would note is that every "ML for planning" approach I've seen does, under the hood, use ML for cost discovery/estimation. These approaches are just trying to balance the data they collect (exploration) with the quality of the plans they produce (exploitation). Interestingly, if you use ML in a way that is completely removed from planning, you actually get <i>worse</i> query plans despite more accurate estimates: <a href="https://people.csail.mit.edu/tatbul/publications/flowloss_vldb21.pdf" rel="nofollow">https://people.csail.mit.edu/tatbul/publications/flowloss_vl...</a> (again, I've got a horse in this race, so my opinion should come with a side of salt :D)</p>
]]></description><pubDate>Wed, 17 Apr 2024 16:02:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=40066557</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=40066557</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40066557</guid></item><item><title><![CDATA[New comment by RMarcus in "Ten years of improvements in PostgreSQL's optimizer"]]></title><description><![CDATA[
<p>PostgreSQL has coarse-grain query hints (like `enable_hashjoin`), and the excellent `pg_hint_plan` extension allows you to specify a complete or partial execution plan: <a href="https://github.com/ossc-db/pg_hint_plan">https://github.com/ossc-db/pg_hint_plan</a></p>
]]></description><pubDate>Wed, 17 Apr 2024 15:55:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=40066452</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=40066452</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40066452</guid></item><item><title><![CDATA[New comment by RMarcus in "Ten years of improvements in PostgreSQL's optimizer"]]></title><description><![CDATA[
<p>It is certainly possible that the plans are similar, and that improvements to the execution engine are being measured. The join order benchmark was designed to test optimizer quality. It is worth noting that <i>in addition</i> to trying to measure the number of pages read from disk, the PG optimizer <i>also</i> tries to reduce the number of tuples examined by the CPU, the number of predicate evaluations, etc. All these numbers are rolled up into a "cost," which is the function that the optimizer minimizes.<p>It is also true that measuring cold cache and warm cache performance can produce different results, and this experiment is certainly in the warm cache scenario. But, the cold cache scenario suffers from the problem you mention as well: an improvement to PG's B-tree that saves a few IOs will dominate any kind of CPU-based improvement (at least at the data size of the join order benchmark).<p>FWIW, the plan for the query with the P90 latency changes from a plan that uses loop and merge join in PG8.4 to a plan that uses hash join in PG16 (where it is no longer the P90 query), which is at least some evidence of optimizer improvements.</p>
]]></description><pubDate>Wed, 17 Apr 2024 15:53:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=40066424</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=40066424</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40066424</guid></item><item><title><![CDATA[New comment by RMarcus in "Ten years of improvements in PostgreSQL's optimizer"]]></title><description><![CDATA[
<p>I totally agree -- I picked the latest version for each major version using the semver interpretation of the version numbers, which is not how PostgreSQL has traditionally done major version numbers (i.e., PG 8.2 and 8.1 are different major versions, but I interpreted the version numbers as if they were minor versions).<p>The main reason I did this was to reduce the number of versions I had to test, but I agree a more complete analysis would test each (true) major version.</p>
]]></description><pubDate>Wed, 17 Apr 2024 15:46:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=40066317</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=40066317</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40066317</guid></item><item><title><![CDATA[New comment by RMarcus in "Ten years of improvements in PostgreSQL's optimizer"]]></title><description><![CDATA[
<p>I'm the author of the blog post.<p>"Tail latency has improved by YMMV for everything else" => yes, I think that's a valid (but conservative) read. Of course, in many (most?) applications, tail latency is very important. Tail latency also tends to be the thing that optimizer engineers target (i.e., reduce the runtime of the longest running query).</p>
]]></description><pubDate>Wed, 17 Apr 2024 15:43:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=40066264</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=40066264</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40066264</guid></item><item><title><![CDATA[New comment by RMarcus in "Pg_hint_plan: Force PostgreSQL to execute query plans the way you want"]]></title><description><![CDATA[
<p>This is the main motivation behind learned "steering" query optimizers: even if a DBA finds the right hint for a query, it is difficult to track that hint through data changes, future DB versions, and even query changes (e.g., if you add another condition to the WHERE clause, should you keep the hints or drop them?). Turns out, with a little bit of systems work, ML models can do a reasonably good job of selecting a good hint for a particular query plan.</p>
]]></description><pubDate>Sat, 16 Mar 2024 19:36:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=39728802</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=39728802</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39728802</guid></item><item><title><![CDATA[New comment by RMarcus in "Pg_hint_plan: Force PostgreSQL to execute query plans the way you want"]]></title><description><![CDATA[
<p>Just wanted to say thank you! This extension was critical to a bunch of my research (and now my lab's research as well). Being able to control fine-grained elements of each plan while letting the PG planner "do the rest" has saved me personally probably 100s of hours of work.</p>
]]></description><pubDate>Sat, 16 Mar 2024 19:32:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=39728763</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=39728763</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39728763</guid></item><item><title><![CDATA[New comment by RMarcus in "SQLite Begin Concurrent"]]></title><description><![CDATA[
<p>Ah, I missed that this requires WAL mode -- indeed, if WAL is used, one transaction should always be able to make progress.</p>
]]></description><pubDate>Fri, 28 Jul 2023 16:37:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=36909500</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=36909500</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36909500</guid></item><item><title><![CDATA[New comment by RMarcus in "SQLite Begin Concurrent"]]></title><description><![CDATA[
<p>My reading is that no deadlocks should be possible since there is only one lock (pages are "locked" optimistically, meaning that the tx is aborted if the page has changed). "Live locks" are possible, where two repeatedly-reissued transactions cause each other to abort forever.</p>
]]></description><pubDate>Thu, 27 Jul 2023 17:48:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=36897455</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=36897455</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36897455</guid></item><item><title><![CDATA[New comment by RMarcus in "Running a Unix-like OS on a home-built CPU with a home-built C compiler (2020)"]]></title><description><![CDATA[
<p>Thanks for the first-hand information! I was also curious about this.<p>> This is not a course everyone enrolls in.<p>This is the ticket -- at both the University of Arizona and MIT, I've seen a group of folks graduate with a CS degree after taking OS, compilers, databases, and abstract algebra. Another another group of folks graduated after taking HCI, software engineering, design, and psychology courses. The two groups had some baseline skills (all knew the basic data structures and algorithms), but otherwise appeared quite distinct.<p>I don't know how to phrase this formally, but I think some statement like the following is true: within-university variance is higher than between-university variance.<p>(When I was younger, I had strong opinions on which one of these groups were "real" computer scientists. This was a very unfortunate way of thinking that prevented me from talking to folks who I later realized were some of the smartest around. I wish someone had corrected me sooner -- solving a problem with inputs/outputs well-defined enough to apply "rigorous" techniques doesn't make those problems inherently valuable or "harder" than others. God gave all the easy problems to the physicists.)</p>
]]></description><pubDate>Sun, 27 Nov 2022 15:19:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=33763466</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=33763466</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=33763466</guid></item><item><title><![CDATA[New comment by RMarcus in "RadixSpline: A Single-Pass Learned Index"]]></title><description><![CDATA[
<p>We recently published a comparison of learned indexes (including RadixSpline and the PGM index posted yesterday)in VLDB: <a href="https://vldb.org/pvldb/vol14/p1-marcus.pdf" rel="nofollow">https://vldb.org/pvldb/vol14/p1-marcus.pdf</a></p>
]]></description><pubDate>Tue, 26 Jan 2021 15:31:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=25916910</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=25916910</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25916910</guid></item><item><title><![CDATA[New comment by RMarcus in "PGM Indexes: Learned indexes that match B-tree performance with 83x less space"]]></title><description><![CDATA[
<p>We produced a detailed comparison of such "fitting" and "learning" techniques, available here: <a href="https://vldb.org/pvldb/vol14/p1-marcus.pdf" rel="nofollow">https://vldb.org/pvldb/vol14/p1-marcus.pdf</a><p>(Thomas Neumann, one of authors of the blog post, is a co-author of the linked paper)</p>
]]></description><pubDate>Mon, 25 Jan 2021 17:36:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=25906101</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=25906101</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25906101</guid></item><item><title><![CDATA[New comment by RMarcus in "PGM Indexes: Learned indexes that match B-tree performance with 83x less space"]]></title><description><![CDATA[
<p>Check out work by Jialin Ding and Vikram Nathan, they both work on multi-dimensional learned index structures.<p><a href="https://arxiv.org/pdf/2006.13282.pdf" rel="nofollow">https://arxiv.org/pdf/2006.13282.pdf</a></p>
]]></description><pubDate>Mon, 25 Jan 2021 17:33:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=25906056</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=25906056</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25906056</guid></item><item><title><![CDATA[New comment by RMarcus in "Ask HN: What is your blog and why should I read it?"]]></title><description><![CDATA[
<p><a href="https://rmarcus.info" rel="nofollow">https://rmarcus.info</a><p>I mostly post interactive or semi-narrative explanations of technical topics I find interesting. 1-3 posts per year.</p>
]]></description><pubDate>Sat, 11 Apr 2020 17:47:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=22842960</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=22842960</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=22842960</guid></item><item><title><![CDATA[New comment by RMarcus in "Comparing Parallel Rust and C++"]]></title><description><![CDATA[
<p>My experience is entirely different -- writing HPC code for supercomputers at Los Alamos National Lab (on and off for 5 years) made me a true Rust believer.<p>One of the things I spent the most time on with Fortran / C++ codes was debugging wrong-result bugs. About 90% of the time, the wrong result came from some edge-case where an array was wrongly freed too early, an array was accessed out of scope, or a race condition caused an array member to be updated in a non-deterministic manner. Each of these bugs required hours of debugging and was a huge time sink. Once I started working with Rust, I never encountered any of these bugs. After about a year of fighting the borrow-checker, I feel my overall efficiency has greatly improved.<p>Now, when I go back and write or read C++ code, patterns that the Rust compiler would yell about jump out at me (multiple unprotected mutable references, cloning unique pointers), and I find these are generally a source of the bug I'm hunting. Like sibling comments point out, a lot (but not all) of the things Rust stops you from doing are just bad practice anyway.<p>Of course, for GPGPU stuff I have to write CUDA or OpenCL, but those are generally small, compact kernels that are easy to reason about end to end.<p>I'm not suggesting that you are doing this, but for me, I initially resisted Rust for a long time. Rust seemed extremely complex, and whenever I'd try to use it I would run into a wall. The loud Rust community talking about how great Rust was and how easy it was to use once you "got it" made me feel stupid. Instead of being humble, I became arrogant, and I'd say things like "Rust is too restrictive for the high performance applications I care about" or "I write code that Rust would find unsafe but is actually super well-tuned for this architecture." For me, these were mental excuses I made because I was unable to accept that I was having such a hard time with Rust, and I considered myself a "high performance computing software engineer!"<p>It took me way longer than most to "get" Rust -- over a year of repeatedly forcing myself to learn and stumble through compiler errors before things started to click. A year after that, and I'm still frequently surprised by certain aspects of the language ("really? I need a & in that match statement?" and "oh god, what does this lifetime and trait bound mean..." are two of the most common). But the parts of Rust that have clicked for me (the borrow checker and associated lifetime mechanics) make Rust very enjoyable to write.<p>Again, I'm not suggesting that you are falling into the same trap I did, I just wanted to post this to encourage anyone else in the "banging their head against the Rust compiler" stage to power through!</p>
]]></description><pubDate>Thu, 07 Nov 2019 19:07:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=21476267</link><dc:creator>RMarcus</dc:creator><comments>https://news.ycombinator.com/item?id=21476267</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=21476267</guid></item></channel></rss>