匹配文件路径字符串的第一部分

时间:2011-05-03 22:22:11

标签: c# optimization memory-management

我有一个简单的类,如下所示:

class Record
{
    public Record(string fp1, string fp2, string fp3)
    {
        Filepath1 = fp1;
        Filepath2 = fp2;
        Filepath3 = fp3;
    }

    public string Filepath1 { get; private set; }
    public string Filepath2 { get; private set; }
    public string Filepath3 { get; private set; }
}

这些文件路径中的每一个都非常相似(并且非常长),并且只会与文件路径的最后几个字符不同。

现在,我希望在内存中有几千条这样的记录,我希望这些记录能耗尽少量的RAM。所以我试着想办法优化内存使用,这是我提出的一个解决方案:

class Record
{
    private string _baseFilepath;
    private string _fp1;
    private string _fp2;
    private string _fp3;
    public Record(string fp1, string fp2, string fp3)
    {
        _baseFilepath = /*get common first part of filepaths*/;
        _fp1 = /*last part of fp1*/;
        _fp2 = /*last part of fp2*/;
        _fp3 = /*last part of fp3*/;
    }

    public string Filepath1
    {
        get { return _baseFilepath + _fp1; }
    }

    public string Filepath2
    {
        get { return _baseFilepath + _fp2; }
    }

    public string Filepath3
    {
        get { return _baseFilepath + _fp3; }
    }
}

你可以看到我可以节省大量的内存,特别是在很长的文件路径中,只有最后几个字符不同。问题是,是否有一种简单的方法来获取文件路径的常见第一部分?

编辑: 内存中可能有多达700,000条记录,实际的生产类还有几条文件路径。我试图让应用程序尽可能轻量级,同时为了简单起见,尽量保持优化非常简单。

3 个答案:

答案 0 :(得分:4)

这样就可以了:

public static string GetCommonStart(string fp1, string fp2, string fp3)
{
    int idx = 0;
    int minLength = Math.Min(Math.Min(fp1.Length, fp2.Length), fp3.Length);
    while (idx < minLength && fp1[idx] == fp2[idx] && fp2[idx] == fp3[idx])
       idx++;
    return fp1.Substring(0, idx);
}

答案 1 :(得分:1)

如果此操作对您来说不是性能关键,则可以使用此类内容:

public static class StringExtensions
{
    public static string GetCommonPrefix(string a, string b)
    {
        int commonPrefixLength = 0;
        int minimumLength = Math.Min(a.Length, b.Length);

        for (int i = 0; i < minimumLength; i++)
        {
            if (a[i] == b[i])
            {
                commonPrefixLength++;
            }
        }

        return a.Substring(0, commonPrefixLength);
    }

    public static string GetCommonPrefix(params string[] strings)
    {
        return strings.Aggregate(GetCommonPrefix);
    }
}

答案 2 :(得分:1)

请将此视为补充答案,提供替代建议,而不是直接回答您的问题(已经提供)。

如果可能的话,我会在第一时间将这些文件路径分解为basesuffix&amp;然后以这种方式通过整个系统。

这适用于

  • 您自己在系统中的某个位置生成这些文件路径
  • 你正在阅读一个已知的&amp;有限的位置集

您只需拥有一组base个文件路径,每个Filepath引用一次base个值,并且还包含自己的suffix值。

取决于base文件路径的数量&amp;如何确定它们,这将显着提高内存效率。您当前的解决方案为最佳情况提供了三分之一内存使用(每个三个文件路径最佳地优化到一个文件路径中)。在整个应用程序中以一致的方式存储此对象(filepath)也是有意义的。