- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个 .npz
文件。所有 .npz 文件都具有相同的结构:每个文件仅包含两个变量,且变量名始终相同。截至目前,我只需循环所有 .npz
文件,检索两个变量值并将它们附加到某个全局变量中:
# Let's assume there are 100 npz files
x_train = []
y_train = []
for npz_file_number in range(100):
data = dict(np.load('{0:04d}.npz'.format(npz_file_number)))
x_train.append(data['x'])
y_train.append(data['y'])
需要一段时间,瓶颈是CPU。 x
和 y
变量附加到 x_train
和 y_train
变量的顺序并不重要。
有什么方法可以多线程加载多个 .npz
文件吗?
最佳答案
我对 @Brent Washburne 的评论感到惊讶,并决定自己尝试一下。我认为一般问题有两个:
首先,读取数据通常受 IO 限制,因此编写多线程代码通常不会产生很高的性能增益。其次,由于语言本身的设计,在Python中进行共享内存并行化本身就很困难。与原生 c 相比,开销要大得多。
但是让我们看看我们能做什么。
# some imports
import numpy as np
import glob
from multiprocessing import Pool
import os
# creating some temporary data
tmp_dir = os.path.join('tmp', 'nptest')
if not os.path.exists(tmp_dir):
os.makedirs(tmp_dir)
for i in range(100):
x = np.random.rand(10000, 50)
file_path = os.path.join(tmp_dir, '%05d.npz' % i)
np.savez_compressed(file_path, x=x)
def read_x(path):
with np.load(path) as data:
return data["x"]
def serial_read(files):
x_list = list(map(read_x, files))
return x_list
def parallel_read(files):
with Pool() as pool:
x_list = pool.map(read_x, files)
return x_list
好了,东西准备得够多了。让我们了解一下时间。
files = glob.glob(os.path.join(tmp_dir, '*.npz'))
%timeit x_serial = serial_read(files)
# 1 loops, best of 3: 7.04 s per loop
%timeit x_parallel = parallel_read(files)
# 1 loops, best of 3: 3.56 s per loop
np.allclose(x_serial, x_parallel)
# True
它实际上看起来像是一个不错的加速。我使用两个真实核心和两个超线程核心。
<小时/>要一次运行所有内容并为其计时,您可以执行以下脚本:
from __future__ import print_function
from __future__ import division
# some imports
import numpy as np
import glob
import sys
import multiprocessing
import os
import timeit
# creating some temporary data
tmp_dir = os.path.join('tmp', 'nptest')
if not os.path.exists(tmp_dir):
os.makedirs(tmp_dir)
for i in range(100):
x = np.random.rand(10000, 50)
file_path = os.path.join(tmp_dir, '%05d.npz' % i)
np.savez_compressed(file_path, x=x)
def read_x(path):
data = dict(np.load(path))
return data['x']
def serial_read(files):
x_list = list(map(read_x, files))
return x_list
def parallel_read(files):
pool = multiprocessing.Pool(processes=4)
x_list = pool.map(read_x, files)
return x_list
files = glob.glob(os.path.join(tmp_dir, '*.npz'))
#files = files[0:5] # to test on a subset of the npz files
# Timing:
timeit_runs = 5
timer = timeit.Timer(lambda: serial_read(files))
print('serial_read: {0:.4f} seconds averaged over {1} runs'
.format(timer.timeit(number=timeit_runs) / timeit_runs,
timeit_runs))
# 1 loops, best of 3: 7.04 s per loop
timer = timeit.Timer(lambda: parallel_read(files))
print('parallel_read: {0:.4f} seconds averaged over {1} runs'
.format(timer.timeit(number=timeit_runs) / timeit_runs,
timeit_runs))
# 1 loops, best of 3: 3.56 s per loop
# Examples of use:
x = serial_read(files)
print('len(x): {0}'.format(len(x))) # len(x): 100
print('len(x[0]): {0}'.format(len(x[0]))) # len(x[0]): 10000
print('len(x[0][0]): {0}'.format(len(x[0][0]))) # len(x[0]): 10000
print('x[0][0]: {0}'.format(x[0][0])) # len(x[0]): 10000
print('x[0].nbytes: {0} MB'.format(x[0].nbytes / 1e6)) # 4.0 MB
关于python - 以多线程方式加载多个 npz 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35328085/
我正在使用 Spyder IDE 和 Python 2.7。 我有一个名为 data.npz 的 npz 文件,它是给我的。我想将此文件加载到 Spyder 并查看其中的内容。 首先,我已经这样做了:
有人可以向我解释为什么这不起作用: 步骤 1) 创建一个简单的 NPZ 文件 import numpy as np a1 = np.zeros((3,2), dtype=np.double) np.s
我有几个 .npz 文件。所有 .npz 文件都具有相同的结构:每个文件仅包含两个变量,且变量名始终相同。截至目前,我只需循环所有 .npz 文件,检索两个变量值并将它们附加到某个全局变量中: # L
我使用以 Python .npz 格式存储的数组。我有很多这样的文件,它们都共享相同的公共(public)结构:文件名 my_file_var1_var2_var3.npz 包含以下项目(所有数组都是
我需要将几个 numpy 数组和 Python 对象保存到磁盘。我想完全最小化 I/O。我不介意加载器或保存器是否必须在内存中进行任何提升,但I/O 占用(实际访问)应该是最低的,因为当许多作业时,我
我有许多形状可能有所不同的 .npz 文件,我想找到哪个文件的形状最大。 npz 中有 2 个数组,我正在寻找第二个数组中最大的一个。以下代码片段有效,但返回形状所需的时间比我预期的要长。这是实现这一
我想更改 npz 文件中的一个值。 npz 文件包含多个 npy,我希望除了一个('run_param')之外的所有文件都保持不变,我想保存在原始文件上。 这是我的工作代码: DATA_DIR = '
谁能分享一些关于 *.npz 内部数据组织的信息?一些文档等。只是找不到任何东西.. 最佳答案 文档如下: Format of .npz files , 指的是 Format of .npy file
Numpy能够读写磁盘上的文本数据或二进制数据。 将数组以二进制格式保存到磁盘 np.load和np.save是读写磁盘数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩
我是 Python 的新手,我急切地从 MATLAB 迁移到 IPython 作为我在实验室进行数据分析的首选语言。 在 MATLAB 中,经过一段时间的数据处理后,我会做 >>> save('myr
Numpy 允许在单个 npz 文件中导出多个数组,然后可以使用以下方法加载该文件: infile = "somefile.npz" inData = np.load( infile) print(
我使用 Web 服务通过 AWS 上的 Jupyter Notebook 来训练我的一些深度学习模型。出于成本原因,我希望将数据作为 .npz 文件存储在我自己的服务器上,并将它们直接加载到我的远程计
如何在不删除之前数据的情况下将数据写入.npz文件? 我正在使用 python numpy 包,我在其中使用 savez() 来保存变量。 但是,每次我将信息保存到文件时,它都会删除以前的信息。例如,
我正在 build 一辆自动驾驶遥控汽车。我有 100 张从 pi 相机拍摄的图像,每一张都被命名为 Direction.jpg 。如何将这些图像转换为单个 .npz 文件,以便我可以训练神经网络。
我有一个如下所示的数据文件: 58f0965a62d62099f5c0771d35dbc218 0.868632614612579 [0.028979932889342308
我有一个例子,我想使用 mmap 模式打开压缩的 numpy 文件,但似乎找不到任何有关它如何在幕后工作的文档。例如,它会在内存中解压存档然后进行 mmap 吗?它会即时解压吗? 该配置缺少文档。 最
我有一个未知的 .npz 文件,想看看里面有什么。我对 Python 很陌生。 >>> import numpy >>> b = numpy.load('data.npz') >>> print(b.
我正在寻找一种从多个不同类型的 numpy 数组中生成压缩二进制字符串的方法。 :D本题推荐的方法: Storing and loading numpy arrays as files 就是使用下面的
我有一个数组: >>> data = np.ones((1,3,128)) 我使用 savez_compressed 将它保存到文件中: >>> with open('afile','w') as f
我是Python新手。我想转换 .npz file (.npz 是 numpy 文件格式)转换为 .csv 文件以在 R 中使用它。请建议一种方法 最佳答案 尝试如下: import numpy as
我是一名优秀的程序员,十分优秀!