我有一个.dat文件,其中包含使用numpy.memmap生成的大型(600000,6,8000)浮点数组。
第三个轴代表日期范围。在运行时,用户指定一个较窄的日期范围。结果是我在执行过程中最终沿第三维array[i, :, user_start:user_end]
进行了数百万次切片。
我知道可以将memmap偏移一个固定的数字,但是有没有一种方法可以在运行开始时限制数组的尺寸,这样我就不需要每次都切第三根轴了? / p>
答案 0 :(得分:2)
内存映射数组的一个切片将使用相同的基础文件创建另一个内存映射数组,因此您可以创建一个新数组,该数组是用户输入定义的切片,然后从此开始使用新数组。
如果url(r'^books/f/$', views.select_team, name='select_team')
是内存映射数组,请定义
@RequestMapping(value = "/GenerarNota", method = RequestMethod.GET)
public @ResponseBody
void GenerarNota(HttpServletRequest req, HttpServletResponse response) throws JRException, IOException, SQLException {
DataSource data = SessionFactoryUtils.getDataSource(session);
HttpServletRequestWrapper srw = new HttpServletRequestWrapper(req);
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(new File(srw.getServletContext().getRealPath(RepRutas.RUTA_NOTA)));
Map parametros = new HashMap();
parametros.put("idPaciente", Integer.parseInt(req.getParameter("idPaciente")));
parametros.put("idResumen", Integer.parseInt(req.getParameter("idResumen")));
parametros.put("tokenNota", Integer.parseInt(req.getParameter("tokenNota")));
parametros.put("RutaRelativa", srw.getServletContext().getRealPath(RepRutas.RUTA_RELATIVA));
parametros.put("idMedico", Integer.parseInt(Sistema.getIdUsuario(req)));
byte[] reporteBytes = JasperRunManager.runReportToPdf(jasperReport, parametros, data.getConnection());
response.setContentType("application/pdf");
response.setHeader("Content-disposition", "inline; filename=Nota_" + req.getParameter("idPaciente") + ".pdf");
response.setHeader("Cache-Control", "max-age=30");
response.setHeader("Pragma", "No-cache");
response.setDateHeader("Expires", 0);
response.setContentLength(reporteBytes.length);
ServletOutputStream out = response.getOutputStream();
out.write(reporteBytes, 0, reporteBytes.length);
out.flush();
out.close();
}
,然后使用a
而不是重复制作b = a[:, :, user_start:user_end]
的同一片。也就是说,使用b
(或a
或什至只使用a[i, :, user_start:user_end]
而不是b[i, :, :]
,因为numpy索引中的最后b[i, :]
是可选的)。 / p>