No, I do not mean that big, big data (in size of terabytes or more). It’s big collection, like when you have a List<string> and it has more than a few hundreds of items. Where to store it?
Naturally, you would want to store that data as a property of a content. it’s convenient and it just works, so you definitely can. But the actual question is: should you?
It’s as simple as this
public virtual IList<String> MyBigProperty {get;set;}
But under the hood, it’s more than just … that. Let’s ignore UI for a moment (rendering such long list is a bad UX no matters how you look at it, but you can simply ignore rendering that property by appropriate attributes), and focus on the backend aspects of it.
List<T> properties are serialized as a long strings, and save at once to database. If you have a big property in your content, this will happen every time you load your content:
- The data must be read from database, then transferred through the network
- The data must be parsed to create an array (the underlying data structure of
List<T>
. The original string is tossed away. - Now you have a big array that you might not use every time. it’s just there taking your previous LOH (as with the original string)
Same thing happens when you actually save that property
- The data must be serialized as string, the
List<T>
is now tossed away - The data then must be transferred through the network
- The data then saved to database. Even though it is a very long string and you changed, maybe 10 characters, it’s completely rewritten. Due to its size, there might be multiple page writes needed.
As you can see, it can create a lot of waste, especially if you rarely use that property. To make the matter worse, due to the size of the property, it means they are taking up space in LOH (large objects heap).
And imagine if you have such properties in each and every of your content. The waste is multiplied, and your site is now at risk of some frequent Gen 2 Garbage collection. Nobody likes visiting a website that freezes (if not crashes) once every 30 minutes.
Then when to store such big collection data?
The obvious answer is … somewhere else. Without other inputs, it’s hard to give you some concrete suggestions, but how’s about a normalized custom table? You have the key as the content reference, and the other column is each value of the list. Just an idea. Then you only load the data when you absolutely need it. More work, yes, but it’s the better way to do it.
Just a reminder that whatever you do, just stay away from DDS – Dynamic Data Store. It’s the worst option of all. Just, don’t 🙂