如何在没有内存错误的情况下加载巨大的时间序列 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 路由器且蓝牙接口关闭的情况下使用?

在没有内存峰值的情况下旋转 UIImage

如何有效地将巨大的 sql 表加载到 asp.net 应用程序内存中以进一步迭代它?

在 Pandas 数据框中加载大表时,如何避免 EC2 中的内存错误?

如何通过 BufferedImage 将巨大的图像加载到 Java?