【发布时间】:2017-08-19 10:33:33
【问题描述】:
我有一千个指纹存储在我的数据库中的 Byte[] 数组中,我正在尝试对指纹进行 1 对 N 验证,这意味着我需要比较传感器给出的指纹和数组中的。
但是这个过程花费的时间太长,我正在使用 forEach 循环遍历数组中的所有指纹并调用验证方法来比较 2 个数组以找到匹配项。
有什么方法可以让我更快地找到匹配项?在最坏的情况下,匹配项是数组中的最后一项。或靠近底部。
指纹列表
List<Huellas> ListaHuellas = new List<Huellas>();
public class Huellas
{
public int idUsuario;
public Byte[] Huella;
}
搜索匹配项
foreach (Huellas h in ListaHuellas) {
// Por cada huella... la almacenamos en un MemoryStream como arreglo de bytes.
MemoryStream fingerprintData = new MemoryStream(h.Huella);
// Creamos una plantilla a partir de esos bytes...
DPFP.Template templateIterando = new DPFP.Template(fingerprintData);
// Extraemos las caracteristicas de la plantilla
DPFP.FeatureSet features = ExtractFeatures(Sample, DPFP.Processing.DataPurpose.Verification);
// Verificamos que las caracteristicas sean buenas
if (features != null) {
// Compare the feature set with our template
DPFP.Verification.Verification.Result result = new DPFP.Verification.Verification.Result();
Verificator.Verify(features, templateIterando, ref result);
// Y vemos si el resultado es valido o no, (verified)
// Si es verified, significa que el dedo escaneado ya existia en la base de datos.
if (result.Verified) {
MessageBox.Show(new Form { TopMost = true }, "Usuario encontrado: ID " + h.idUsuario);
// Por ultimo se cierra el programa.
this.Invoke(new MethodInvoker(delegate { this.Close(); }));
}
}
}
对不起,西班牙 cmets。
【问题讨论】:
-
我建议查看
Parallel.ForEach。 -
您存储的是原始指纹数据,而不是特征提取的结果? IIRC(很长一段时间,可能是不同的产品)您将从指纹中提取特征并获得哈希结果,您可以通过哈希搜索数据库。您可能需要查看指纹软件的文档以获取存储指纹数据以进行识别的示例。或者,如果他们是这样做的,那就买一个不同的开发工具包。
-
如果您使用的
List已排序,您可以使用某种形式的二分搜索算法来减少搜索期间的迭代次数。一般来说,迭代列表的最有效方法是使用for或foreach语句(来源:stackoverflow.com/questions/15204/…) -
@Will 我将字节数组的 base64 字符串存储在数据库中,但解码回字节数组进行验证,因为 SDK 提供的方法将其作为参数接收
-
你有没有分析过这段代码,看看哪个步骤一直在走,并研究了如何减少它?实际的循环将非常非常快。但是循环调用了很多其他方法。例如,如果
ExtractFeatures函数需要很长时间,这可能是限制步骤,您可以寻找改进它的选项。这是您要匹配的指纹吗?如果是这样,您是否需要在每次循环时在同一个 Sample 上运行此ExtractFeatures?不能移到循环外吗?
标签: c# list optimization foreach fingerprint