views:

248

answers:

9

I'm trying to start using plain text files to store data on a server, rather than storing them all in a big MySQL database. The problem is that I would likely be generating thousands of folders and hundreds of thousands of files (if I ever have to scale). What are the problems with doing this? Does it get really slow? Is it about the same performance as using a Database?

What I mean: Instead of having a database that stores a blog table, then has a row that contains "author", "message" and "date" I would instead have: A folder for the specific post, then *.txt files inside that folder than has "author", "message" and "date" stored in them.

+5  A: 

This would be immensely slower reading than a database (file writes all happen at about the same speed--you can't store a write in memory).

Databases are optimized and meant to handle such large amounts of structured data. File systems are not. It would be a mistake to try to replicate a database with a file system. After all, you can index your database columns, but it's tough to index the file system without another tool.

Databases are built for rapid data access and retrieval. File systems are built for data storage. Use the right tool for the job. In this case, it's absolutely a database.

That being said, if you want to create HTML files for the posts and then store those locales in a DB so that you can easily get to them, then that's definitely a good solution (a la Movable Type).

But if you store these things on a file system, how can you find out your latest post? Most prolific author? Most controversial author? All of those things are trivial with a database, and very hard with a file system. Stick with the database, you'll be glad you did.

Eric
Immensely slower to do what? That's a breathtakingly broad assertion.
le dorfier
>>> This would be immensely slower reading than a database <<< Not a fact. Database in any case is placed **over** file system, and file system provides its own very good cache, so you may probably loose much more on IPC and others... In fact, you may run simple benchmarks to see it.
Artyom
Jeff Atwood of stack overflow mentioned here : http://www.codinghorror.com/blog/archives/001291.htmlthat he used movable type (mentioned above) for his blog which wrote the static html and used a cgi post back that also wrote the comments to the static html page. It seems this would be able to handle many more page requests than a database. But maybe if you used memcached or some other caching engine, you could achieve similar results. I think you would have to have a pretty huge blog to need to write posts to static html files.
jimiyash
A: 

Databases are NOT faster. Think about it: In the end they store the data in the filesystem as well. So the question if a database is faster depends strongly on the access path.

If you have only one access path, which correlates with your file structure the file system might be way faster then a database. Just make sure you have some caching available for the filesystem.

Of course you do loose all the nice things of a database: - transactions - flexible ways to index data, and therefore access data in a flexible way reasonably fast. - flexible (though ugly) query language - high recoverability.

The scaling really depends on the filesystem used. AFAIK most file system have some kind of upper limit for number of files (totally or per directory), though on the new ones this is often very high. For hundreds and thousands of files with some directory structure to keep directories to a reasonable size it should be possible to find a well performing file system.

@Eric's comment: It depends on what you need. If you only need the content of exact on file per query, and you can determine the location and name of the file in a deterministic way the direct access is faster than what a database does, which is roughly:

  • access a bunch of index entries, in order to
  • access a bunch of table rows (rdbms typically read blocks that contain multiple rows), in order to
  • pick a single row from the block.

If you look at it: you have indexes and additional rows in memory, which make your caching inefficient, where is the the speedup of a db supposed to come from?

Databases are great for the general case. But if you have a special case, there is almost always a special solution that is better in some sense.

Jens Schauder
Your logic is rather flawed: Just because they store something on the filesystem, too, doesn't mean that they access it at the same speed. Databases will store multiple rows in one file, and have that file indexed. This is remarkably faster than having multiple files, all without an index. It would only be faster in the most simplistic of cases, and will definitely not be faster across thousands of entries.
Eric
Databases store as much in memory as possible (in the least, the indexes) and don't have to access the file table since almost all it's data is stored in a single file.
Richard Szalay
I totally agree with this answer, (-1)s are not really correct. In fact, PostgreSQL relates **heavily** of **File System** cache, even more then on its own internal cache.
Artyom
FYI, I didn't downvote the answer; just added a comment.
Richard Szalay
@Richard yes and no: yes my logic is aggressively simplified. No: in the special cases where information is accessed through a single path, the database cache mimicks the filesystem cache.
Jens Schauder
+4  A: 

It is really depends:

  • What is file size
  • What durability requirements do you have?
  • How many updates do you perform?
  • What is file system?

It is not obvious that MySQL would be faster:

I did once such comparison for small object in order to use it as sessions storage for CppCMS. With one index (Key Only) and Two indexes (primary key and secondary timeout).

File System:   XFS     ext3 
-----------------------------
Writes/s:      322     20,000

Data Base \  Indexes:    Key Only   Key+Timeout
-----------------------------------------------
Berkeley DB              34,400      1,450
Sqlite No Sync            4,600      3,400
Sqlite Delayed Commit    20,800     11,700

As you can see, with simple Ext3 file system was faster or as fast as Sqlite3 for storing data because it does not give you (D) of ACID.

On the other hand... DB gives you many, many important features you probably need, so I would not recommend using files as storage unless you really need it.

Remember, DB is not always the bottle neck of the system

Artyom
+1  A: 

You don't really say why you won't use a database yourself... But in the scenario you are describing I would definitely use a DB over folder any day, for a couple of reasons. First of all, the blog scenario seems very simple but it is very easy to imagine that you, someday, would like to expand it with more functionality such as search, more post details, categories etc.

I think that growing the model would be harder to do in a folder structure than in a DB.

Also, databases are usually MUCH faster that file access due to indexing and memory caching.

JohannesH
+2  A: 

I think the key here is that there will be NO indexing on your data. SO to retrieve anything in say a search would be rediculously slow compared to an indexed database. Also, IO operations are expensive, a database could be (partially) in memory, which makes the data available much faster.

Colin
A: 

IIRC Fudforum used the file-storage for speed reasons, it can be a lot faster to grab a file than to search a DB index, retrieve the data from the DB and send it to the user. You're trading the filesystem interface with the DB and DB-library interfaces.

However, that doesn't mean it will be faster or slower. I think you'll find writing is quicker on the filesystem, but reading faster on the DB for general issues. If, like fudforum, you have relatively immutable data that you want to show several posts in one, then a file-basd approach may be a lot faster: eg they don't have to search for every related post, they stick it all in 1 text file and display it once. If you can employ that kind of optimisation, then your file-based approach will work.

Also, mail servers work in the file-based approach too, the Maildir format stores each email message as a file in a directory, not in a database.

one thing I would say though, you'll be better storing everything in 1 file, not 3. The filesystem is better at reading (and caching) a single file than it is with multiple ones. So if you want to store each message as 3 parts, save them all in a single file, read it to get any of the parts and just display the one you want to show.

gbjbaanb
+4  A: 

Forget about long-winded answers, here's the simplest reasons why storing data in plaintext files is a bad idea:

  1. It's near-impossible to query. How would you sort blog posts by date? You'd have to read all the files and compare their date, or maintain your own index file (basically, write your own database system.)

  2. It's a nightmare to backup. tar cjf won't cut it, and if you try you may end up with an inconsistent snapshot.

There's probably a dozen other good reasons not to use files, it's hard to monitor performance, very hard to debug, near impossible to recover in case of error, there's no tools to handle them, etc...

Josh Davis
A: 

Hi,

if you are preferred to go away with RDBMS, why dont u try the other open source key value or document DBs (Non- relational Dbs)..

From ur posting i understand that u r not goin to follow any ACID properties of relational db.. it would be better to adapt other key value dbs (mongodb,coutchdb or hyphertable) instead of your own file system implementation.. it will give better performance than the existing approaches..

Note: I am not also expert in this.. just started working on MongoDB and find useful in similar scenarios. just wanted to share in case u r not aware of these approaches

Cheers

Ramesh Vel

Ramesh Vel
A: 

...and then you want to search all posts by an author and you get to read a million files instead of a simple SQL query...

peufeu