TrapFetch is trained by monitoring the read requests issued by an application. It detects bursts of disk reads, determines the appropriate addresses at which breakpoints should be inserted in the application and library codes prior to the bursts of reads, and then logs this information with the data requested during the interval between each consecutive pair of breakpoints. When the application and library codes are loaded from the disk into memory, TrapFetch inserts breakpoints at the designated addresses based on the logs. During subsequent runs, TrapFetch is invoked at each breakpoint when it prefetches the corresponding data into the page cache. This approach is effective during both launch and run-time. TrapFetch operates at the user level, thus avoiding interference with other applications. In experiments on five popular applications (FlightGear, SpeedDreams 2, Pillars of Eternity, Eclipse, and VegaStrike), TrapFetch reduced the time for launch by up to 39.7% and time for run-time dataloading by up to 63.7%.