如何在没有内存错误的情况下加载巨大的时间序列 Windows 数据集?
Posted
技术标签:
【中文标题】如何在没有内存错误的情况下加载巨大的时间序列 Windows 数据集?【英文标题】:How to load huge time series windows dataset without memory errors? 【发布时间】:2022-01-18 01:03:13 【问题描述】:我想将大约 100 万行的典型时间序列数据集转换为具有 50% 重叠的 100 项窗口。请注意,它是一个多变量的,例如,给定 8 个特征和 1000 个包含 100 个项目的窗口,最终形状将是 (1000, 100, 8)
替换 (n_samples, n_timesteps, n_features)
。目标是用它来训练机器学习算法,包括深度神经网络。
到目前为止,我很喜欢使用 numpy 的 sliding_window_view
,如下所示;
x = np.arange(100).reshape(20, 5)
v = sliding_window_view(x, (3, 5))
v
不幸的是,当我在数百万行的大型数据集中用完 RAM 时出现崩溃。你有什么建议吗?
此外,一个严重的限制是每个时间步长(整数)都有一个连续标签,数据集需要根据该标签进行分组(使用pandas
),因此这限制了部分读取它的一些选项。
【问题讨论】:
【参考方案1】:我想你正在寻找tf.data.Dataset
。我正在处理一百万行数据集,以下代码对我来说运行良好:
convert = tf.data.TextLineDataset("path_to_file.txt")
dataset = tf.data.Dataset.zip(convert)
现在你已经初始化了你的数据集,但是不要陷入内存问题:
def dataset_batches(ds, batch_size):
return (
ds
.cache()
.batch(batch_size)
.prefetch(tf.data.AUTOTUNE) )
# you can do more operations here
train_batches = dataset_batches(dataset, 64)
要运行它,你必须循环:
for (batch, row) in enumerate(train_batche):
# do stuff
# batch = current batch (0, 1, 2, ...) so if your dataset has 1600 rows and you've used batch_size=16 you'll have 100 batches
# row is the actual data (tensor)
【讨论】:
谢谢,但是当您需要制作滑动窗口并在之后随机播放它们时会发生什么?以上是关于如何在没有内存错误的情况下加载巨大的时间序列 Windows 数据集?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不先加载到 RAM 的情况下将文件加载到 blob 中?
Multipeer Connectivity Framework (iOS7) 如何在附近没有 Wi-Fi 路由器且蓝牙接口关闭的情况下使用?
如何有效地将巨大的 sql 表加载到 asp.net 应用程序内存中以进一步迭代它?