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

问题描述:

我有一个简单的类像下面这样:匹配的文件路径字符串的第一部分

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; } 
    } 
} 

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

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

+1

万条记录将占用一兆字节左右。您是否在严格受限的硬件上运行? – 2011-05-03 22:24:12

+0

它实际上取决于。这是针对服务器应用程序的,每个连接到服务器的用户都可能导致4000条记录在内存中。 – Phil 2011-05-03 22:30:22

+0

哦,这不是我的制作课,只是一个例子。在现实生活中将会有更多的文件路径。 – Phil 2011-05-03 22:32:29

这将做到这一点:

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); 
} 
+0

不错,我会添加一个检查以确保你不会超过最短字符串的长度。 ex'c:\ 1.jpg'和'c:\ 1.jpg.jpg'会出错。就像那样编辑。 :) – 2011-05-03 22:30:43

+0

@Biff:已经在:-) – BrokenGlass 2011-05-03 22:32:41

您可以使用这样的事情,如果这个动作是不是性能关键你:

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); 
    } 
} 

请考虑这个补充答案,提供替代建议,而不是直接回答您的问题(已提供)。

如果可能,我会在第一个可能的机会&将这些文件路径分为basesuffix,然后通过整个系统以这种方式传递。

这如果

  • 你自己在你的系统
  • 你是从已知的&有限集合地点

你也只会读取文件生成这些文件路径,地方适用一组base文件路径,以及那些base值的每一次引用Filepath,也包含了自己suffix价值。

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