Python:散列大量的大数
我有一个大数据问题。我的python程序计算从1到2^32的数字,我想知道我是否已经计算了一个数字 我可以使用半GB的内存将它们作为位图进行跟踪。但是,由于有些数字可以和其他数字一起放在一个袋子里(每个袋子大约100个数字),我想知道是否有其他方法可以存储我的值,比如散列,但占用的内存更少Python:散列大量的大数,python,dataset,Python,Dataset,我有一个大数据问题。我的python程序计算从1到2^32的数字,我想知道我是否已经计算了一个数字 我可以使用半GB的内存将它们作为位图进行跟踪。但是,由于有些数字可以和其他数字一起放在一个袋子里(每个袋子大约100个数字),我想知道是否有其他方法可以存储我的值,比如散列,但占用的内存更少 谢谢您的帮助。正如我在上面的评论中所说,您可以使用存储所有计算数字的集合。 当你计算一个新的数字时,你会检查它是否已经是集合 考虑计算是计算数字的函数 computedNumbers = set() #
谢谢您的帮助。正如我在上面的评论中所说,您可以使用存储所有计算数字的
集合。
当你计算一个新的数字时,你会检查它是否已经是集合
考虑<代码>计算<代码>是计算数字
的函数
computedNumbers = set() # initialize set
for i in range(1, 2**32): # for loop
number = compute(i)
if number in computedNumbers:
print("Number", number, " is already computed!")
else:
computedNumbers.add(number) # add the number to the set
希望这对您有所帮助。如果我的计算正确,最多存储2^32/100个4字节的值将消耗超过170MB的RAM。我不喜欢在超过100MB的内存中搜索我的值,但是将它们组织在不同的列表中是一个巨大的优点。尝试使用间隔。例如,如果您已经计算了从1
到1000
的所有数字,并且在下一次迭代中,您计算了800
,那么您只需检查这个数字是否在已经计算过的区间内。@AnnZen我认为使用list
不是很有效,因为复杂性是O(n)
。您可以使用set
来达到O(1)
的平均值,使用中的操作符。感谢您对间隔的想法,但我想这不会成功,因为我没有按顺序计算数字,我必须跟踪所有间隔,直到它们填满为止。您不需要if
语句,set()
将自动删除重复项。@AnnZen是的,我知道!实际上,我添加了if
,以防他想print
或者做一些事情,如果同一个数字被多次计算。谢谢你,我只是没有想到集合,因为我的1位值转换成32位值。但是,由于我在位图方法中每个数字使用大约100位,所以每个数字只使用32位是很好的。“我会试试看。”若你们觉得合适的话,别忘了接受答案。