这是我的问题(我在用C语言编程):
我有一些包含DNA序列的巨大文本文件(每个文件大约有6500万行,大小约为4-5GB)。这些文件中有许多重复项(还不知道有多少,但应该有很多百万个),我想返回一个仅包含独特值的输出文件。每个字符串都有一个关联的质量值,因此,例如,如果我有5个相同的字符串具有不同的质量值,我将保留最好的一个并丢弃其他4个。
尽可能减少内存需求和提高速度效率至关重要。 我的想法是使用哈希函数创建JudyHS数组,以将String DNA序列(长度为76个字符,并具有7个可能的字符)转换为整数,以减少内存使用(在许多百万个条目上,4或8个字节而不是76个字节应该是相当大的成就)。这样,我可以使用整数作为索引,并仅存储该索引的最佳质量值。问题是我找不到一个哈希函数,可以唯一地定义这么长的字符串并产生可以存储在整数甚至long long中的值!
我对哈希函数的第一个想法是类似于Java中默认字符串哈希函数的东西:s [0] * 31 ^(n-1)+ s [1] * 31 ^(n-2)+ ... + s [n-1],但我可能会获得一个最大值为8.52 * 10 ^ 59..太大了。 那么将其存储在double中是否会使计算变得更慢? 请注意,我想找到一种唯一定义字符串的方法,避免冲突(或者至少它们应该极其罕见,因为每次冲突我都必须访问磁盘,这是相当昂贵的操作...)。
我有一些包含DNA序列的巨大文本文件(每个文件大约有6500万行,大小约为4-5GB)。这些文件中有许多重复项(还不知道有多少,但应该有很多百万个),我想返回一个仅包含独特值的输出文件。每个字符串都有一个关联的质量值,因此,例如,如果我有5个相同的字符串具有不同的质量值,我将保留最好的一个并丢弃其他4个。
尽可能减少内存需求和提高速度效率至关重要。 我的想法是使用哈希函数创建JudyHS数组,以将String DNA序列(长度为76个字符,并具有7个可能的字符)转换为整数,以减少内存使用(在许多百万个条目上,4或8个字节而不是76个字节应该是相当大的成就)。这样,我可以使用整数作为索引,并仅存储该索引的最佳质量值。问题是我找不到一个哈希函数,可以唯一地定义这么长的字符串并产生可以存储在整数甚至long long中的值!
我对哈希函数的第一个想法是类似于Java中默认字符串哈希函数的东西:s [0] * 31 ^(n-1)+ s [1] * 31 ^(n-2)+ ... + s [n-1],但我可能会获得一个最大值为8.52 * 10 ^ 59..太大了。 那么将其存储在double中是否会使计算变得更慢? 请注意,我想找到一种唯一定义字符串的方法,避免冲突(或者至少它们应该极其罕见,因为每次冲突我都必须访问磁盘,这是相当昂贵的操作...)。