Memory-mapped arrays let you work with very big data files without loading everything into memory. This helps when your data is too large to fit in your computer's RAM.
Memory-mapped arrays for large data in NumPy
import numpy as np # Create or load a memory-mapped array memmap_array = np.memmap(filename, dtype=data_type, mode='r+', shape=(rows, columns))
filename is the path to the file on disk.
dtype is the data type of the array elements (e.g., np.float64).
mode can be 'r' (read-only), 'r+' (read-write), 'w+' (create or overwrite), or 'c' (copy-on-write).
shape defines the dimensions of the array.
import numpy as np # Example 1: Create a new memory-mapped array file memmap_array = np.memmap('data.dat', dtype=np.float64, mode='w+', shape=(1000, 1000)) memmap_array[:] = 0 # Initialize with zeros memmap_array.flush() # Save changes to disk
import numpy as np # Example 2: Load an existing memory-mapped array in read-only mode memmap_array = np.memmap('data.dat', dtype=np.float64, mode='r', shape=(1000, 1000)) print(memmap_array[0, 0])
import numpy as np # Example 3: Edge case - file does not exist with mode='r+' try: memmap_array = np.memmap('missing.dat', dtype=np.float64, mode='r+', shape=(10, 10)) except FileNotFoundError as error: print('File not found:', error)
import numpy as np # Example 4: Edge case - single element array memmap_array = np.memmap('single_element.dat', dtype=np.int32, mode='w+', shape=(1,)) memmap_array[0] = 42 memmap_array.flush() print(memmap_array[0])
This program creates a large memory-mapped array file, initializes it, modifies a small block, and then reads it back in read-only mode to confirm the changes.
import numpy as np import os filename = 'large_data.dat' # Step 1: Create a large memory-mapped array file (100x100) filled with zeros if os.path.exists(filename): os.remove(filename) # Remove if exists to start fresh large_memmap = np.memmap(filename, dtype=np.float64, mode='w+', shape=(100, 100)) large_memmap[:] = 0 large_memmap.flush() print('Initial sum of all elements:', large_memmap.sum()) # Step 2: Modify a small part of the array large_memmap[10:15, 10:15] = 5.5 large_memmap.flush() print('Sum after modification:', large_memmap.sum()) # Step 3: Load the same file in read-only mode and check values loaded_memmap = np.memmap(filename, dtype=np.float64, mode='r', shape=(100, 100)) print('Value at (12, 12):', loaded_memmap[12, 12]) print('Sum from loaded array:', loaded_memmap.sum())
Time complexity: Accessing or modifying elements is fast and similar to normal arrays, but initial file creation depends on file size.
Space complexity: Uses disk space equal to the array size; RAM usage is low because data is loaded on demand.
Common mistake: Forgetting to call flush() to save changes to disk when using write modes.
Use memory-mapped arrays when data is too large for RAM. For small data, normal numpy arrays are simpler and faster.
Memory-mapped arrays let you work with large data files without loading all data into memory.
They behave like normal numpy arrays but store data on disk, saving RAM.
Remember to flush changes to save them, and handle file existence carefully.
Practice
numpy.memmap for large data files?Solution
Step 1: Understand memory usage with large files
Loading large files fully into RAM can cause memory errors or slowdowns.Step 2: Role of
Memory-mapped arrays let you access parts of the file on disk as if they were in memory, avoiding full loading.numpy.memmapFinal Answer:
It allows working with data without loading the entire file into memory. -> Option AQuick Check:
Memory-mapping = Partial loading [OK]
- Thinking memmap compresses data
- Assuming memmap speeds up CPU/GPU
- Believing memmap auto-deletes files
data.dat with shape (100, 100) and dtype float64?Solution
Step 1: Check required parameters for memmap
Must specify filename, dtype, mode, and shape for memmap creation.Step 2: Validate each option
np.memmap('data.dat', dtype='float64', mode='r+', shape=(100, 100)) correctly uses dtype='float64', mode='r+', and shape=(100, 100). Others have wrong dtype or missing mode.Final Answer:
np.memmap('data.dat', dtype='float64', mode='r+', shape=(100, 100)) -> Option BQuick Check:
Correct dtype, mode, shape = np.memmap('data.dat', dtype='float64', mode='r+', shape=(100, 100)) [OK]
- Omitting mode parameter
- Using wrong dtype
- Swapping dtype and shape order
print(mm[0, 0])?
import numpy as np filename = 'test.dat' mm = np.memmap(filename, dtype='int32', mode='w+', shape=(2, 2)) mm[0, 0] = 10 mm.flush() mm2 = np.memmap(filename, dtype='int32', mode='r', shape=(2, 2)) print(mm2[0, 0])
Solution
Step 1: Write value and flush to disk
Value 10 is assigned to mm[0,0] and flushed, saving to file.Step 2: Read from file with new memmap
mm2 reads the same file in read mode, so mm2[0,0] is 10.Final Answer:
10 -> Option CQuick Check:
Flush saves data, read memmap shows 10 [OK]
- Forgetting to flush before reading
- Expecting zero without initialization
- Confusing write and read modes
import numpy as np filename = 'data.dat' mm = np.memmap(filename, dtype='float64', mode='r+', shape=(3, 3)) mm[0, 0] = 5.0 mm.flush()Assume
data.dat does not exist before running this code.Solution
Step 1: Understand mode 'r+'
Mode 'r+' opens file for reading and writing but requires the file to exist.Step 2: Check file existence
Since 'data.dat' does not exist, opening with 'r+' raises FileNotFoundError.Final Answer:
FileNotFoundError because mode 'r+' requires existing file. -> Option DQuick Check:
Mode 'r+' needs existing file [OK]
- Assuming 'r+' creates file
- Confusing 'r+' with 'w+'
- Ignoring file existence requirement
large_data.dat with shape (10000, 10000) and dtype float32. You want to increment all values by 1 without loading the entire file into memory. Which approach using numpy.memmap is best?Solution
Step 1: Avoid loading entire file
Loading full 10000x10000 array uses too much RAM, so avoid np.fromfile full load.Step 2: Use memmap with mode 'r+' and process in chunks
Memmap with 'r+' allows read/write access. Looping over rows increments data without full load. Flushing saves changes.Step 3: Evaluate other options
Load entire file with np.fromfile, add 1, then save back. loads full file (bad for memory). Open memmap with mode 'w+', increment only first 100 elements, flush once. only increments part of data. Use memmap with mode 'r', add 1 to the array, then flush. uses 'r' mode (read-only), so cannot modify.Final Answer:
Create a memmap with mode 'r+', loop over rows, increment each row, flush after each. -> Option AQuick Check:
Memmap + chunk update + flush = Create a memmap with mode 'r+', loop over rows, increment each row, flush after each. [OK]
- Loading entire file into memory
- Using read-only mode for writing
- Modifying only part of data
Ready to prove it?
Pass the test and this pattern moves unknown
