我有一个简单的类,如下所示:
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条记录,实际的生产类还有几条文件路径。我试图让应用程序尽可能轻量级,同时为了简单起见,尽量保持优化非常简单。
答案 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)
请将此视为补充答案,提供替代建议,而不是直接回答您的问题(已经提供)。
如果可能的话,我会在第一时间将这些文件路径分解为base
和suffix
&amp;然后以这种方式通过整个系统。
这适用于
您只需拥有一组base
个文件路径,每个Filepath
引用一次base
个值,并且还包含自己的suffix
值。
取决于base
文件路径的数量&amp;如何确定它们,这将显着提高内存效率。您当前的解决方案为最佳情况提供了三分之一内存使用(每个三个文件路径最佳地优化到一个文件路径中)。在整个应用程序中以一致的方式存储此对象(filepath
)也是有意义的。