匹配的文件路径字符串的第一部分
我有一个简单的类像下面这样:匹配的文件路径字符串的第一部分
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万条记录在内存中,实际生产类有几个文件路径。我试图让应用尽可能轻量化,同时为了简单起见,尽量保持优化非常简单。
这将做到这一点:
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);
}
不错,我会添加一个检查以确保你不会超过最短字符串的长度。 ex'c:\ 1.jpg'和'c:\ 1.jpg.jpg'会出错。就像那样编辑。 :) – 2011-05-03 22:30:43
@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);
}
}
请考虑这个补充答案,提供替代建议,而不是直接回答您的问题(已提供)。
如果可能,我会在第一个可能的机会&将这些文件路径分为base
和suffix
,然后通过整个系统以这种方式传递。
这如果
- 你自己在你的系统
- 你是从已知的&有限集合地点
你也只会读取文件生成这些文件路径,地方适用一组base
文件路径,以及那些base
值的每一次引用Filepath
,也包含了自己suffix
价值。
根据base
文件路径的数量&如何确定它们,这将显着提高内存效率。您当前的解决方案提供了最佳情况下的三分之一内存使用量(每个三个文件路径最佳优化为一个文件路径)。在整个应用程序中以一致的方式存储此对象(filepath
)也是有意义的。
万条记录将占用一兆字节左右。您是否在严格受限的硬件上运行? – 2011-05-03 22:24:12
它实际上取决于。这是针对服务器应用程序的,每个连接到服务器的用户都可能导致4000条记录在内存中。 – Phil 2011-05-03 22:30:22
哦,这不是我的制作课,只是一个例子。在现实生活中将会有更多的文件路径。 – Phil 2011-05-03 22:32:29