Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python在文件中存储巨大的哈希表_Python_File_Hashtable - Fatal编程技术网

用Python在文件中存储巨大的哈希表

用Python在文件中存储巨大的哈希表,python,file,hashtable,Python,File,Hashtable,嘿。我有一个我想记忆的函数,但是,它有太多可能的值。是否有任何方便的方法将值存储在文本文件中并从中读取?例如,在文本文件中存储一个预计算的素数列表(最多10^9个)?我知道读取文本文件的速度很慢,但是如果数据量真的很大,就没有其他选择了。谢谢 您可以使用在文件中存储类似字典的结构。从Python文档中: import shelve d = shelve.open(filename) # open -- file may get suffix added by low-level

嘿。我有一个我想记忆的函数,但是,它有太多可能的值。是否有任何方便的方法将值存储在文本文件中并从中读取?例如,在文本文件中存储一个预计算的素数列表(最多10^9个)?我知道读取文本文件的速度很慢,但是如果数据量真的很大,就没有其他选择了。谢谢

您可以使用在文件中存储类似字典的结构。从Python文档中:

import shelve

d = shelve.open(filename) # open -- file may get suffix added by low-level
                          # library

d[key] = data   # store data at key (overwrites old data if
                # using an existing key)
data = d[key]   # retrieve a COPY of data at key (raise KeyError if no
                # such key)
del d[key]      # delete data stored at key (raises KeyError
                # if no such key)
flag = d.has_key(key)   # true if the key exists
klist = d.keys() # a list of all existing keys (slow!)

# as d was opened WITHOUT writeback=True, beware:
d['xx'] = range(4)  # this works as expected, but...
d['xx'].append(5)   # *this doesn't!* -- d['xx'] is STILL range(4)!

# having opened d without writeback=True, you need to code carefully:
temp = d['xx']      # extracts the copy
temp.append(5)      # mutates the copy
d['xx'] = temp      # stores the copy right back, to persist it

# or, d=shelve.open(filename,writeback=True) would let you just code
# d['xx'].append(5) and have it work as expected, BUT it would also
# consume more memory and make the d.close() operation slower.

d.close()       # close it

你也可以从梯子上走下一步,使用它。从pickle()导入,因此,如果您不需要添加shelve的功能,这可能会为您节省一些时钟周期(尽管它们对您来说真的不重要,因为您选择了python来进行大量存储)

因为,我只需以逗号分隔的格式将预计算的素数列表存储在一个文本文件中,最多10**8。它在这种尺寸下运行良好,但不能很好地扩展到更大的尺寸


如果你的“大”不是真的那么大,我会使用像我一样简单的东西,否则我会像其他人所说的那样使用shelve。

对于最多10**9的素数列表,你为什么需要散列?钥匙是什么?!听起来像是一个简单、直接的二进制文件的绝佳机会!到目前为止,大约有
10**9/ln(10**9)
这样的素数,即5000万或更少。在每素数4字节的情况下,这仅为200 MB或更少——非常适合
数组.array(“L”)
及其方法,如
fromfile
等(请参阅)。在许多情况下,您实际上可以将所有200 MB存储在内存中,但最坏的情况是,您可以获取其中的一部分(例如,通过和
array.array的
fromstring
方法),在那里进行二进制搜索(例如,通过),等等


当您确实需要一个巨大的键值存储时--GB,而不是微不足道的200MB!-)我曾经推荐
shelve
,但在经历了巨大的存储架(性能、可靠性等)带来的不愉快的现实生活之后,我现在推荐一个数据库引擎——sqlite很好,它与Python一起提供,PostgreSQL更好,非关系型的,比如CouchDB更好,等等。

让我们看看瓶颈在哪里。当你要读取一个文件时,硬盘必须转动到足以读取文件的程度;然后它读取一个大块并缓存结果

所以你们需要一种方法,能够准确地猜出你们要从文件中读取的位置,然后准确地执行一次。我非常确定标准DB模块会适合您,但您可以自己做——只需以二进制模式打开文件进行读/写,并将您的值存储为30位(=100位=13字节)的数字


然后使用标准的
文件
方法。

简单地将哈希表粘贴到磁盘上,与内存中的实现相比,将导致大约5个数量级的性能损失(如果您有SSD,则至少会导致3个数量级的性能损失)。在处理硬盘时,您需要提取您可以获得的每一位数据位置和缓存

正确的选择将取决于用例的细节。您需要多少性能?您需要对数据结构执行什么类型的操作?您是只需要检查表是否包含键,还是需要基于键获取值?您可以预计算该表,还是需要能够动态修改它?你期望的命中率是多少?你们能用布卢姆过滤器过滤掉大量的操作吗?请求是均匀分布的还是您期望某种时间位置?你能提前预测星团的位置吗


如果您不需要终极性能,或者可以并行化并抛出硬件解决问题,请查看一些。

您也可以使用终极暴力,创建一个Python文件,其中只包含一条语句:

seedprimes = [3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,
79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173, ...
然后导入它。(这是一个素数最多为1e5:)的文件


在没有解释的情况下否决投票是没有太多信息的。。。请提供一个,因为lutz花了一些时间试图找到一个合适的答案。+1,我不知道这个答案有什么错。有人知道这有多快吗?据我所知
array.fromfile
将内容读入内存,我假设OP将“大”定义为“不适合内存的东西”。“不适合内存”是“大”的有用定义,但与给定用例的
primes<10**9
不匹配:这是我在第一段中解释的,以及如何处理其他内容,在第二段中,完全不同的情况是巨大的;-)。我的回答是一个很好的例子,在阅读整个要点之前先回答。抱歉。是否无法将文件中的缓冲区和数组合并到文件的mmap视图中?以某种方式magically@kaizer.se,我不知道有任何现有模块提供这样的“阵列视图”。根据应用程序的具体需要,也许可以对arraymodule.c进行一些编辑。@OP:我是否正确地猜测了您对“巨大”的定义是“无法放入内存的东西”?我认为他对“巨大”的定义是“一个预计算的素数列表,最多10^9”,所以这大概是50847534个值。“我知道读取文本文件很慢”真的吗?你怎么知道的?与什么相比很慢?如果你运行一些基准测试,你可能会发现它实际上很快。
from primes_up_to_1e9 import seedprimes