A method of operating a re-programmable non-volatile memory system to store data received by the memory system with logical addresses within a logical address range (202; 215), wherein the memory system includes a flash memory comprising an array of memory cells organized into distinct operating blocks of cells, the memory cells within individual blocks being simultaneously erased prior to writing data therein, and a controller connected with the flash memory including a microprocessor operated by firmware, the method comprising the controller: dividing the data received by the memory system into equal sized individual units (204; 219) of data that individually contain an amount of data equal to or less than a storage capacity of the individual memory cell blocks, the individual units of data having contiguous logical addresses within the logical address range (202; 215), transforming the individual units (204; 219) of received data by at least one of encoding, compressing or encrypting the received data into corresponding groups of data (207; 225) that individually contain a different amount of data than existed in their corresponding individual units (204; 219) of data prior to transformation, writing the groups of data into contiguous locations within one or more of the memory cell blocks with at least one physical block boundary coincident with at least one address boundary for a group of the groups of data (207; 225), including splitting into two sub-groups an individual group (207; 225) that spans across two memory cell blocks with one of the sub-groups located in each of the two memory cell blocks and maintaining a central table of the logical addresses of the individual units of data (204; 219) and locations of their corresponding individual groups (207; 225) and sub-groups of data within the memory cell blocks that includes maintaining address boundaries defined for the individual groups (207; 225) and sub-groups of data that are within the physical block boundaries of the memory cell blocks. dividing the data received by the memory system into equal sized individual units (204; 219) of data that individually contain an amount of data equal to or less than a storage capacity of the individual memory cell blocks, the individual units of data having contiguous logical addresses within the logical address range (202; 215), transforming the individual units (204; 219) of received data by at least one of encoding, compressing or encrypting the received data into corresponding groups of data (207; 225) that individually contain a different amount of data than existed in their corresponding individual units (204; 219) of data prior to transformation, writing the groups of data into contiguous locations within one or more of the memory cell blocks with at least one physical block boundary coincident with at least one address boundary for a group of the groups of data (207; 225), including splitting into two sub-groups an individual group (207; 225) that spans across two memory cell blocks with one of the sub-groups located in each of the two memory cell blocks and maintaining a central table of the logical addresses of the individual units of data (204; 219) and locations of their corresponding individual groups (207; 225) and sub-groups of data within the memory cell blocks that includes maintaining address boundaries defined for the individual groups (207; 225) and sub-groups of data that are within the physical block boundaries of the memory cell blocks.