Если я вас правильно понимаю, это не простая задача.Как я понял, вы хотите оставить дескриптор файла открытым и использовать файл как место для хранения символьных данных.
Скажем, у вас есть файл типа
a
b
c
иВы хотели заменить «b» на «bb».Это будет боль, потому что файл на самом деле выглядит как a\nb\nc
- вы не можете просто перезаписать b
, вам нужен еще один байт.
Мой совет - попытаться найти способчтобы ваш алгоритм работал без использования файла для дополнительного хранилища.Если у вас переполнение стека, скорее всего, у вас не хватило памяти, вы переполнили стек вызовов, который на намного меньше.
Вы можете попробовать переработать свой алгоритм, чтобы небыть рекурсивнымИногда вы можете использовать list
для замены стека вызовов - но есть много вещей, которые вы могли бы сделать, и я не думаю, что мог бы дать много общих советов, не видя ваш алгоритм.
edit
Ах, я понимаю, что вы имеете в виду ... когда список
while counter <= primes_upper_limit:
numbers.append(counter)
counter += 2L
становится действительно большим, вам может не хватить памяти.Итак, я думаю, вы в основном делаете сито, и поэтому у вас большой список numbers
?Это имеет смысл.Если вы хотите продолжать делать это таким образом, вы можете попробовать массив numpy
bool
, потому что он будет использовать существенно меньше памяти на ячейку:
import numpy as np
numbers = np.repeat(True, a/2)
Или (и, возможно, это не привлекательно)Вы могли бы пойти с совершенно другим подходом, который не использует большой список, такой как полный факторинг числа и выбор наибольшего фактора.
Что-то вроде:
factors = [ ]
tail = a
while tail > 1:
j = 2
while 1:
if tail % j == 0:
factors.append(j)
tail = tail / j
print('%s %s' % (factors, tail))
break
else:
j += 1
т.е.Если бы факторинг 20
: tail
начинался как 20
, то вы обнаружили, что 2
tail
становится 10
, затем он становится 5
.
Это не очень эффективно и будетстановиться слишком длинным для большого (миллиардов) простых чисел, но это нормально для чисел с небольшими коэффициентами.
Я имею в виду, что ваше сито тоже хорошо, пока у вас не закончится память;).Вы можете дать numpy
выстрел.