我正在尝试实施this question中已接受的答案来生成ID,并使用XML文件存储我的内容和内容ID表。
这个想法是每个内容项都将被存储(序列化)为my-content-item-slug-374871.xml,其中数字是内容项将从ID表中提供的随机ID(来自于尚未采取的)。我的要求是ID是一个六位数(显示要求)在100000和999999之间,因此我们实际上只能创建899999个内容项,但这应该足够了。如果你想知道为什么会有这样的要求,我只能说我不希望ID从零开始,我不想要像GUID那样的ID(这会更容易创建和维护,我知道),因为ID将是用于MVC路由(很像SO的URL)。
所以对于初学者我决定创建一个Dictionary,其中key是ID,值决定是否使用它(如果使用则为true,如果可用则为false)。然后,我使用DataContractSerializer将此对象序列化为XML文件。
该文件长72MB,在这里我认为问题开始出现了。首先,我只是试图在VS2010,记事本,写字板和IE中打开这个文件,它们都崩溃了,内存消耗也一路飙升。但应用程序似乎没有任何问题。我仍然认为这将是巨大的内存和CPU占用和性能将受到影响。
我是不是在我的assumptiosn,如果是的话,我的其他选择是什么?
答案 0 :(得分:1)
我建议和Henk一样(只使用顺序,种子ID),但是你可以完成你想要的东西:
不是创建具有所有可能值的字典,而是仅使用已使用值的GenericList将不那么密集:
static class Static
{
static List<int> UsedIds = new List<int>();
}
然后循环直到找到尚未使用的那个。 (Randoms可能不是最好的选择,除非你独立于时钟播种它们。)
int GetNewId()
{
Random rand = new Random();
while (true)
{
int newId = rand.Next(100000, 999999);
if (!Static.UsedIDs.Contains(newId))
{
Static.UsedIDs.Add(newId);
return newId;
}
}
}
这应该在短期中更有效,但是对于长期性能和可扩展性,我强烈建议使用种子身份或GUID - 这是在Base-64编码时非常有用(类似于YouTube网址)。
答案 1 :(得分:0)
对于初学者我决定创建一个词典,
你会发现BitArray占用的空间要少得多。
但基本问题是:为什么'随机'?
如果您需要唯一ID,请使用计数器。以100000开始,每次使用时增加。
答案 2 :(得分:0)
不是维护已使用数字的列表,只需创建新文件名并执行File.Exists(fileName)调用,如果它不存在则不使用它。
编辑:抱歉,假设语言是C#,但这个想法应该与其他语言类似。