Halloween DealsAmazon USHalloween week deals: useful picks before month-endAmazon US: current deals, useful picks and tech finds.Check DealsSlow PC?RecommendedPC slow today? Run a repair scan before it gets worseResolve common Windows issues and optimize system performance.Scan NowHalloween DealsAmazon USOctober picks are moving - compare before checkoutAmazon US: current deals, useful picks and tech finds.See Picks×
FREEDOM251

Freedom251 › Blog › Data Engineering

Architectural Breakdown: I Pulled Nine Years of My Own DEV.to Data—and the Numbers Were Not What I Expected

By Freedom251 Team · · 4 min read

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Muhammad Hammad’s attempt to collect nine years of his DEV.to publishing history ran into two separate problems: a large in-memory workload and a mismatch between the platform’s article count and his local database. His reported figures—847 articles in the dashboard, 612 database records, and a failed fetch that used more than 3.2 GB of Python heap—describe one project, not a general DEV.to benchmark. The architectural response he describes was to replace an accumulating in-memory workflow with bounded streaming, capacity-limited queues, and batched writes.

What did the nine-year DEV.to data pull uncover?

In a DEV Community article dated September 25, 2026, Muhammad Hammad describes collecting and analyzing his own publishing history. The effort revealed a count discrepancy as well as a resource problem in his first implementation.

As an Amazon Associate I earn from qualifying purchases.

Figure What Hammad reports
847 articles Listed in his DEV.to dashboard
612 records Present in his database
235 articles The difference between those counts
About 510 MB Estimated size of the raw, uncompressed JSON
More than 3.2 GB Python heap use in the failed in-memory attempt

These are Hammad’s project-specific figures, not independently measured platform statistics. He attributes the missing records to soft deletion by DEV.to, but the available article excerpt does not show an audit trail or other confirmation of that explanation. A dashboard/database count difference establishes a discrepancy; it does not, on its own, establish what caused it. Read Hammad’s DEV Community article.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Why did the in-memory approach fail?

A straightforward paginated collector often fetches each page, appends the results to a growing collection, and then performs later transformations or joins. That can be convenient for a small dataset. As the collection grows, however, the process must retain more objects at once. Parsing JSON and joining related data can add further working copies, so memory consumption may exceed the size of the raw response files.

Hammad says his naive fetch crashed at page 47. In his account, raw JSON was estimated at about 510 MB, while joined data could expand roughly fourfold. He reports Python heap use exceeding 3.2 GB during the failed attempt. These figures help explain the shape of the problem in this project, but they are not a benchmark for other archives: memory use depends on implementation, data shape, runtime, and what is retained during processing.

What architectural change did Hammad make?

Rather than treating the archive as one dataset to fetch and hold in memory, Hammad says he treated it as a streaming pipeline. He describes using Python’s standard library, bounded components, capacity-limited queues, and batched writes. As he puts it: “The fix was not adding more RAM. The fix was stopping the treatment of this like a data processing problem and starting to treat it like a streaming pipeline problem.”

Rank #2
Sale
Storytelling with Data: A Data Visualization Guide for Business Professionals
  • Wiley
  • Language: english
  • Book - storytelling with data: a data visualization guide for business professionals

The principle is to move data through stages in manageable portions instead of allowing an ever-growing in-memory collection to become the central store. A capacity-limited queue can constrain how much work accumulates between stages, while batched writes can group persistence operations. The excerpt does not provide enough detail to reconstruct Hammad’s full pipeline, persistence design, validation rules, checkpointing behavior, or a reproducible performance comparison.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

When is streaming a better fit than accumulating everything?

Consideration Fetch and accumulate in memory Bounded streaming
Memory as data grows The retained collection grows with the fetched data; joins or copies can raise the working set. Bounded stages can limit how much data is in flight, depending on their implementation.
Resume after failure Not established by the approach alone; it depends on added persistence or checkpoint logic. Not established by streaming alone; checkpoints and recovery rules must be designed.
Rate limits and throughput Not quantified in Hammad’s excerpt. Not quantified in Hammad’s excerpt; concurrency and batch size still need to respect source limits.
Implementation effort Often simpler for a small, bounded dataset. Requires coordinating stages and handling partial progress, failures, and backpressure.
Count reconciliation Requires explicit comparison against source totals and record-level checks. Also requires explicit comparison against source totals and record-level checks.

Streaming is not automatically faster or more reliable. Its practical advantage is control over the amount of work held in memory. For a modest archive that fits comfortably in memory, the simpler approach may be entirely adequate. For a growing archive, especially one that must be joined or transformed, bounded processing can make resource use more predictable.

What should developers verify when collecting a paginated archive?

  • Separate source counts from local counts. Record the platform’s reported total and the number of records actually persisted, then investigate any gap rather than assuming its cause.
  • Account for expansion. The raw response size does not necessarily predict peak memory when data is parsed, copied, or joined.
  • Bound work in progress. Set queue capacities and batch sizes deliberately so a slow downstream stage cannot allow unlimited data to accumulate.
  • Plan recovery explicitly. Streaming does not itself provide checkpoints, retries, duplicate handling, or proof that all pages were processed.
  • Measure the actual workload. Hammad’s memory figures describe his own failed run; they should not be used to size another developer’s machine without testing that workload.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Data EngineeringDEV.toPythonsoftware architecturestreaming

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Recommended PC Tool
Recommended PC Tool
Crashes, No Sound, or Screen Glitches?Free driver scan
Windows Errors? Fix Them Before They SpreadFree repair scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.