不确定对你来说最好的行动方案是什么,或者这是否真的对你有帮助,但是..
您似乎正在寻找一种从结构化文件中查找和读取特定记录的方法。
为此,您可以定义一个封装记录字段以及访问方法的类。
这是一个例子。在我的机器上,它创建、存储 22k+ 条记录并在大约 20 毫秒内查找一些记录。 Otoh 进行 100 次随机搜索需要 3.5 秒,这显然是因为它总是从开头开始。再次进行顺序搜索相当快..
当然,总时间取决于您的机器以及您要查找和阅读的记录数..
这是一个记录类,它包含一个字节、一个长整数和一个字符串:
class aRecord
{
byte aByte { get; set; }
long aLong { get; set; }
string aString { get; set; }
public aRecord() { }
public aRecord(byte b_, long l_, string s_)
{ aByte = b_; aLong = l_; aString = s_; }
public void writeToStream(BinaryWriter bw )
{
bw.Write(aByte);
bw.Write(aLong);
bw.Write(aString);
}
public void readFromStream(BinaryReader br)
{
aByte = br.ReadByte();
aLong = br.ReadInt64();
aString = br.ReadString();
}
static public aRecord readFromStream(BinaryReader br, int record)
{
int r = 0;
aRecord rec = new aRecord();
br.BaseStream.Position = 0;
while (br.PeekChar() != -1 & r <= record )
{
rec.readFromStream(br);
r++;
}
return rec;
}
static public aRecord readFromStream(BinaryReader br, string search)
{
aRecord rec = new aRecord();
while (br.PeekChar() != -1 )
{
rec.readFromStream(br);
if (rec.aString.Contains(search)) return rec;
}
return null;
}
}
我是这样测试的:
Console.WriteLine(DateTime.Now.ToString("ss,ffff") + " init ");
List<aRecord> data = new List<aRecord>();
Random rnd = new Random(9);
int count = 23000;
for (int i = 1000; i < count; i++ )
{
data.Add(new aRecord((byte)(i%128), i, "X" + rnd.Next(13456).ToString()));
}
Console.WriteLine(DateTime.Now.ToString("ss,ffff") + " write ");
string fileName = "D:\\_DataStream.dat";
FileStream sw = new FileStream(fileName, FileMode.Create);
BinaryWriter bw = new BinaryWriter(sw);
foreach(aRecord r in data)
{
r.writeToStream(bw);
}
bw.Flush();
sw.Close();
bw.Close();
FileStream sr = new FileStream(fileName, FileMode.Open);
BinaryReader br = new BinaryReader(sr);
List<aRecord> data2 = new List<aRecord>();
Console.WriteLine(DateTime.Now.ToString("ss,ffff") + " begin search");
for (int i = 0; i < 100; i++)
{
aRecord rec = aRecord.readFromStream(br, "911");
if (rec != null) data2.Add(rec);
}
Console.WriteLine(DateTime.Now.ToString("ss,ffff") + " done. found " + data2.Count);
Console.WriteLine(DateTime.Now.ToString("ss,ffff") + " seek ");
aRecord ar = aRecord.readFromStream(br, 0);
Console.WriteLine(DateTime.Now.ToString("ss,ffff") + " 0 ");
aRecord ar1 = aRecord.readFromStream(br, 1);
Console.WriteLine(DateTime.Now.ToString("ss,ffff") + " 1 ");
aRecord ar2 = aRecord.readFromStream(br, 13000);
Console.WriteLine(DateTime.Now.ToString("ss,ffff") + " 13000 ");
aRecord ar3 = aRecord.readFromStream(br, 23000-1);
Console.WriteLine(DateTime.Now.ToString("ss,ffff") + " 23000 end ");
br.Close();
sr.Close();
您的标题与优化Dictionary有关。这取决于主要用途:阅读还是写作?如果您在字典中阅读了很多内容,最好创建一个SortedDictionary。如果您需要创建比预期读取正常Dictionary 更多的 mor 条目会更好..
..还有更多的集合类,但首先要找出真正的瓶颈。上面的 seek&read 例程不会浪费时间将数据插入到 Dictionary 中,而是简单地丢弃它们,直到找到正确的记录。我还添加了一种搜索方法,该方法在每次点击同一位置后继续。扩展类以满足您自己的需要相当简单。
27,2208 初始化
27,2297 写
27,2438 次搜索
27,2438 开始搜索
27,3097 完成。找到 38 个
27,3097 0 结束
27,3097 1 个结束
27,3457 13000 结束
27,4037 23000 结束