🤖 AI & Analysis · 7 min read
Why Is My CSV Too Large to Analyze?
A CSV that opens fine on your laptop gets refused by the tool you want to ask a question of. The file is not corrupt and the columns are not broken. It is simply past a number that belongs to the destination, and the message you get back rarely says which number that was.
Quick answer
For ChatGPT specifically, OpenAI's own help centre documents 512MB per file as the hard limit, and then a tighter one for the case that matters here: for CSV files or spreadsheets the file size cannot exceed approximately 50MB, depending on the size of each row. So the useful ceiling for a spreadsheet is roughly a tenth of the number most people quote. That 50MB is not a fixed row count: we measured it as about 2,016,492 rows at 5 short columns, 200,876 rows at 20 columns of 12-character values, and 20,963 rows at 100 wide columns, which is why the vendor's wording has to include “depending on the size of each row”.
The documented limits, in the vendor's words
Quoting the source matters here because the numbers are widely repeated with the sizes mixed up. OpenAI's File Uploads FAQ says this:
All files uploaded to a GPT or a ChatGPT conversation have a hard limit of 512MB per file. All text and document files uploaded to a GPT or to a ChatGPT conversation are capped at 2M tokens per file. This limitation does not apply to spreadsheets. For CSV files or spreadsheets, the file size cannot exceed approximately 50MB, depending on the size of each row.
Three separate ceilings in one answer, and the ordering surprises people: the general cap is 512MB, the spreadsheet cap is about 50MB, and text documents carry a token cap instead of a byte cap. A CSV is a spreadsheet as far as this limit is concerned, so a 90MB CSV is over its applicable limit while being comfortably under the headline number.
The same page documents limits that have nothing to do with file size but produce similar symptoms: a rolling upload rate of up to 80 files every 3 hours for paid plans, 3 file uploads per day for free users, storage caps of 25GB per user and 100GB per organization shared across chats, Projects and custom GPT knowledge, and the note that failed upload attempts can sometimes count toward the upload-rate cap. If your file is small and still refused, one of those is more likely than size.
What 50MB actually is, in rows
Because the limit is expressed in bytes and the problem is expressed in rows, the translation is the part worth having. We generated CSVs of different shapes and measured the bytes per row on 2026-09-24, then divided the documented limits by them.
| Shape of the CSV | Bytes per row | Rows in 50MB | Rows in 512MB |
|---|---|---|---|
| 5 columns, 4-character values | 26 | 2,016,492 | 20,648,881 |
| 20 columns, 4-character values | 101 | 519,097 | 5,315,553 |
| 20 columns, 12-character values | 261 | 200,876 | 2,056,976 |
| 50 columns, 12-character values | 651 | 80,535 | 824,686 |
| 100 columns, 24-character values | 2,501 | 20,963 | 214,662 |
Read the last column against the first: at 5 short columns a 50MB file holds two million rows, and at 100 wide columns it holds about twenty thousand. The same limit is a hundred times less generous in rows, purely because of how wide the rows are. That is the whole reason a monthly export from one system is fine and the identical row count from another is not.
To anchor it with one real file: a 1,000,000-row by 5-column numeric CSV that we wrote came to 46,000,026 bytes, or 43.9MB — just under the spreadsheet line. A million rows is a number people use as a safety margin, and in this shape it happens to be a correct one. Add four more columns of realistic text and the same row count lands well over.
Which limit did you hit?
The message usually says the file is too large without naming the ceiling, so match your symptom to the four possibilities:
| What you see | Most likely cause | Check |
|---|---|---|
| Refused immediately on attaching a CSV or XLSX | The spreadsheet size limit, about 50MB per the vendor's documentation | The file size, not the row count. Compare it against the CSV versus XLSX size gap too, because the two formats differ a lot for the same rows |
| Refused, but the file is clearly small | Rolling upload rate or shared storage cap, not size | How many files you have attached in the last three hours, and whether earlier attempts failed |
| Uploads, then answers about only part of the file | The content cap on text files, documented as 2M tokens per file | Whether the answer counts match a partial file, and whether totals look like they are missing rows |
| The tool stalls or the tab dies with no message | The reader is holding the whole table in memory | The cell count, rows times columns, against the memory arithmetic for wide files |
One caveat on the row-count question specifically: if a chat model answers a question about a 12,000-row file with a total, it may have produced a correct figure while getting a row count wrong — we documented that exact behaviour in our two-pass test of a chat model on a messy CSV, where the totals matched a script while one count did not. Being under the size limit does not mean every number in the answer is right, and the two problems get conflated because both surface as “the analysis was wrong”.
Four fixes, ranked by how much data you keep
- Drop columns the question does not need. This is the one that keeps the file honest. Counts, totals and averages stay correct because every row survives, and the file gets smaller in proportion to the width you remove — up to a hundredfold between our narrowest and widest test shape.
- Split by rows, keeping the header on every part. A split file answers per-part questions correctly. It cannot answer questions about the whole population, so know which kind of question you are asking before you start cutting. A CSV splitter does this in the browser without altering values.
- Convert to a format the destination handles. If the tool accepts a workbook, an export with formatting stripped can be smaller than the CSV that fed it. Check the numbers rather than assuming, since the direction varies with the data — the measured comparison is in the file size guide.
- Move the question to where the data already lives. When the file genuinely cannot shrink because the analysis needs every row and every column, a database is the right home for it and the chat window is the wrong one. Our guide to loading a CSV into SQLite covers the transfer, and then the aggregate query runs without moving the file at all.
Before any of those, look at what is actually in the file. A large export usually carries columns nobody has used in years, and the CSV analyzer shows the column list with the values in each one, which is the fastest way to decide what can go. If the file also opens with everything in one column, fix that first: a misdelimtered file is usually much larger than it needs to be, because the delimiters are being stored as data.
Frequently asked questions
What is the file size limit for a CSV in ChatGPT?
OpenAI's File Uploads FAQ states that files uploaded to a GPT or a ChatGPT conversation have a hard limit of 512MB per file, and that for CSV files or spreadsheets the file size cannot exceed approximately 50MB, depending on the size of each row. So the CSV path is the tighter one: a 90MB CSV is inside the 512MB ceiling and still over the spreadsheet limit that applies to it.
How many rows is 50MB of CSV?
It depends entirely on how wide each row is, which is why OpenAI's own wording says the limit depends on the size of each row. We measured typical shapes: at 5 columns of short numeric values a 50MB file holds about 2,016,492 rows; at 20 columns with 12-character values about 200,876 rows; at 50 columns about 80,535 rows; at 100 columns of 24 characters about 20,963 rows. A million rows by 5 columns came to 46,000,026 bytes, or 43.9MB, so that export sits just under the line.
Why does ChatGPT say it cannot read my CSV when the file is small?
Size is one of several separate limits and the error message does not tell you which one you hit. OpenAI also documents a rolling upload rate of up to 80 files every 3 hours for paid plans and 3 file uploads per day for free users, storage caps of 25GB per user and 100GB per organization, and a cap on how many files can be attached. Failed upload attempts can count toward the upload-rate cap, so a file that was rejected earlier can push later attempts over a limit that has nothing to do with its size.
Does splitting a large CSV break the analysis?
It changes what can be answered. A per-part question such as totals, averages or data quality inside each part works fine on split files. A question that needs the whole population at once, such as exact distinct counts, percentiles or year-over-year comparison, cannot be answered correctly from parts, because rows that belong together may sit in different files. Split by row only when the question is per-part or when the parts can be recombined in the tool doing the analysis.
Is it better to use fewer columns or fewer rows?
Fewer columns, if the columns are not needed for the question. Removing fields reduces the file in a way that keeps every row, so counts and totals stay correct. Dropping rows to fit under a limit changes the population and every number computed from it. In our measurements the same row count shrank from 2,501 bytes per row at 100 wide columns to 26 bytes per row at 5 short columns, so column selection buys far more room than row trimming does.
Can I just compress the CSV and upload that?
Only if the receiving tool documents that it opens archives, which most do not for the chat attachment path. Compressing your own copy is still worth doing for transfer and storage, and we measured earlier that gzip at level 6 took a 2,883,657-byte CSV down to 613,416 bytes. But a .gz file is not a spreadsheet as far as the uploader is concerned, so check the supported file list before relying on it, and treat compression as a transport step rather than a way past a row or width limit.
What is the fastest way to make a CSV analysable?
Drop the columns nothing in your question needs, keep the header row, then check the file size against the limit that applies to the destination rather than against your own patience. If the file still will not fit, split it by rows and keep the header on every part. If the question genuinely needs the whole table, the file belongs in a database or a local analysis tool rather than in a chat attachment.
Do the same limits apply to other AI tools?
Every tool sets its own, and the numbers should be read from that vendor's own documentation rather than assumed from another one's. What transfers between tools is the arithmetic rather than the ceiling: multiply rows by columns to get the cell count, and estimate the file size from the bytes per row you actually have. The limit changes per vendor; the size of your file does not.
Tools mentioned in this guide
Measuring an export and splitting it are short scripts. These cover the cases where you would rather not write one:
- OpenCode Go — writing a million-row file, measuring its bytes per row and re-running that on your own export tells you which limit you are about to hit before the uploader does. Try OpenCode Go
- Stack AI — when the same oversized export lands on a schedule, a workflow can trim and split it on arrival so the analysis step receives a file inside its limit instead of failing. Try Stack AI
- Softr — if the rows are re-exported and re-uploaded every month, a no-code app that holds the records once removes the size problem instead of managing it. Try Softr
Some links above are affiliate links — if you buy through them we may earn a commission at no extra cost to you. OpenCode Go uses our referral link; the other two currently point to each vendor's official page until our tracking links are approved.
See What Your Export Can Lose
Paste a few rows and see every column and its values, so you can take the width out before you take the rows out.
The quoted limits — 512MB per file, the 2M-token cap on text and document files, and “for CSV files or spreadsheets, the file size cannot exceed approximately 50MB, depending on the size of each row” — are from OpenAI's File Uploads FAQ, retrieved on 2026-09-24, as are the rolling upload rate, the per-user and per-organization storage caps and the note about failed uploads counting toward the rate. Every bytes-per-row figure and row count in the two tables comes from CSVs we generated and measured on 2026-09-24, including the 1,000,000-row by 5-column file at 46,000,026 bytes; the raw output is kept with our other measurement records. Limits change, so check the vendor page before relying on a number.
Related reading
AI & Analysis — other guides that pair well with this one.
- AI Crawlers in robots.txt
- agent-tools.json Explained
- Split a Large CSV File Online
- Compare Two CSV Files Online
Browse all guides in the NoCodeCSV blog.