Traceback (most recent call last): File "/run-1341144766-1067082874/solution.py", line 27, in main() File "/run-1341144766-1067082874/solution.py", line 11, in main if len(s[i:j+1]) > 0: MemoryError Error in sys.excepthook: Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 64, in apport_excepthook from apport.fileutils import likely_packaged, get_recent_crashes File "/usr/lib/python2.7/dist-packages/apport/__init__.py", line 1, in from apport.report import Report MemoryError Original exception was: Traceback (most recent call last): File "/run-1341144766-1067082874/solution.py", line 27, in main() File "/run-1341144766-1067082874/solution.py", line 11, in main if len(s[i:j+1]) > 0: MemoryError
The above errors appeared when I tried to run the following program. Can someone explain what is a memory error, and how to overcome this problem? . The program takes strings as input and finds all possible sub strings and creates a set(in a lexicographical order) out of it and it should print the value at the respective index asked by the user otherwise it should print ‘Invalid’
def main(): no_str = int(raw_input()) sub_strings=  for k in xrange(0,no_str): s = raw_input() a=len(s) for i in xrange(0, a): for j in xrange(0, a): if j >= i: if len(s[i:j+1]) > 0: sub_strings.append(s[i:j+1]) sub_strings = list(set(sub_strings)) sub_strings.sort() queries= int(raw_input()) resul =  for i in xrange(0,queries): resul.append(int(raw_input())) for p in resul: try: print sub_strings[p-1] except IndexError: print 'INVALID' if __name__ == "__main__": main()
This one here:
s = raw_input() a=len(s) for i in xrange(0, a): for j in xrange(0, a): if j >= i: if len(s[i:j+1]) > 0: sub_strings.append(s[i:j+1])
seems to be very inefficient and expensive for large strings.
for i in xrange(0, a): for j in xrange(i, a): # ensures that j >= i, no test required part = buffer(s, i, j+1-i) # don't duplicate data if len(part) > 0: sub_Strings.append(part)
A buffer object keeps a reference to the original string and start and length attributes. This way, no unnecessary duplication of data occurs.
A string of length
l*l/2 sub strings of average length
l/2, so the memory consumption would roughly be
l*l*l/4. With a buffer, it is much smaller.
buffer() only exists in 2.x. 3.x has
memoryview(), which is utilized slightly different.
Even better would be to compute the indexes and cut out the substring on demand.
If you get an unexpected
MemoryError and you think you should have plenty of RAM available, it might be because you are using a 32-bit python installation.
The easy solution, if you have a 64-bit operating system, is to switch to a 64-bit installation of python.
The issue is that 32-bit python only has access to ~4GB of RAM. This can shrink even further if your operating system is 32-bit, because of the operating system overhead.
You can learn more about why 32-bit operating systems are limited to ~4GB of RAM here: https://superuser.com/questions/372881/is-there-a-technical-reason-why-32-bit-windows-is-limited-to-4gb-of-ram
A memory error means that your program has ran out of memory. This means that your program somehow creates too many objects.
In your example, you have to look for parts of your algorithm that could be consuming a lot of memory. I suspect that your program is given very long strings as inputs. Therefore,
s[i:j+1] could be the culprit, since it creates a new list. The first time you use it though, it is not necessary because you don’t use the created list. You could try to see if the following helps:
if j + 1 < a: sub_strings.append(s[i:j+1])
Also note that since you use
if j >= i:, you don’t need to start your
xrange at 0. You can have:
for i in xrange(0, a): for j in xrange(i, a): # No need for if j >= i
A more radical alternative would be to try to rework your algorithm so that you don’t pre-compute all possible sub-strings. Instead, you could simply compute the substring that are asked.
you could try to create the same script that popups that error, dividing the script into several script by importing from external script. Example, hello.py expect an error Memory error, so i divide hello.py into several scripts h.py e.py ll.py o.py all of them have to get into a folder “hellohello” into that folder create init.py into init write import h,e,ll,o and then on ide you write import hellohello
Either there’s a error in your code or you are out of memory, you can upgrade it or for for quick solution try increasing your virtual memory.
check program with this input:abc/if you got something like ab ac bc abc program works well and you need a stronger RAM otherwise the program is wrong.
Using python 64 bit solves lot of problems.