我已经实现了 Atkin筛法,在接近100,000,000的素数以内它表现良好。但超过此范围就会因为内存问题而出错。
我想用硬盘替换基于内存的数组。Python的"wb"文件函数和Seek函数可能可以解决这个问题。在重新发明轮子之前,有人能提供建议吗?首先出现了两个问题:
- 是否有一种方法将Atkin筛法分成内存中的段并运行,
- 是否有一种方法可以暂停活动并稍后回来 - 这意味着我可以序列化内存变量并恢复它们。
为什么要这样做?一个为了娱乐和保持头脑活跃的老人。
我已经实现了 Atkin筛法,在接近100,000,000的素数以内它表现良好。但超过此范围就会因为内存问题而出错。
我想用硬盘替换基于内存的数组。Python的"wb"文件函数和Seek函数可能可以解决这个问题。在重新发明轮子之前,有人能提供建议吗?首先出现了两个问题:
为什么要这样做?一个为了娱乐和保持头脑活跃的老人。
信号
处理程序来捕获应用程序终止的时刻。这样可以在终止之前保存当前状态。下面的脚本展示了当重新启动时简单数字计数器的继续计数。import signal, os, cPickle
class MyState:
def __init__(self):
self.count = 1
def stop_handler(signum, frame):
global running
running = False
signal.signal(signal.SIGINT, stop_handler)
running = True
state_filename = "state.txt"
if os.path.isfile(state_filename):
with open(state_filename, "rb") as f_state:
my_state = cPickle.load(f_state)
else:
my_state = MyState()
while running:
print my_state.count
my_state.count += 1
with open(state_filename, "wb") as f_state:
cPickle.dump(my_state, f_state)
关于提高磁盘写入速度,你可以尝试使用1Mb或更大的缓存来增加Python的文件缓冲区,例如open('output.txt', 'w', 2**20)
。使用with
处理器也应确保您的文件被刷新和关闭。
max
的数字,使用一个大小为(max-1)/24+1
字节的数组就足够了。所以对于100,000,000来说,大约需要4MB的内存。 - barak manosO(sqrt(N))
,即大约10KB足矣。问题在于你的具体实现。展示代码并询问如何改进其内存使用情况。 - jfs