我在S3上有一个存储桶和一个SageMaker笔记本。我尝试访问存储在S3存储桶中的相当大的BDF和EDF文件(1-2 GB) ,而不将它们上传到SageMaker卷。我还需要通过 URL 访问这些文件,因为EDF处理函数接收文件的绝对路径作为输入。mne.io.read_raw_edf
S3存储桶与Sagemaker Notebook Instance位于同一区域。与笔记本实例关联的 IAM 角色被授予访问S3存储桶的权限。
首先,我尝试使用this question中的方法,该方法描述了如何读取.csv
文件。尽管就我而言,它与.csv
文件配合得很好,但对文件却失败了.edf
。
import pandas as pd
from sagemaker import get_execution_role
role = get_execution_role()
bucket='my-bucket'
key = 'train.edf'
data_location = 's3://{}/{}'.format(bucket, key)
mne.io.read_raw_edf(data_location)
当我执行此代码时,我收到以下错误:
FileNotFoundError: [Errno 2] No such file or directory: '/home/ec2-user/SageMaker/s3:/my-bucket/train.edf'
在这里,我面临一个不是我做的路径堆叠。我不太明白为什么pd.read_csv
通常读取路径,不像mne.io.read_raw_edf
,它似乎堆叠了本地路径和服务器路径。
然后我找到了一个非常相似的问题的答案,但在堆叠路径方面遇到了非常相似的问题。
import boto3
bucket_location = boto3.client('s3').get_bucket_location(Bucket=bucket)
object_url = "https://s3-{0}.amazonaws.com/{1}/{2}".format(
bucket_location['LocationConstraint'],
bucket,
key)
object_url
'https://s3-us-west-2.amazonaws.com/my-bucket/train.edf'
在这里我们可以看到路径是正常存储的。
mne.io.read_raw_edf(object_url)
当我执行此代码时,我收到以下错误:
FileNotFoundError: [Errno 2] No such file or directory: '/home/ec2-user/SageMaker/https:/s3-us-west-2.amazonaws.com/my-bucket/train.edf'
mne.io.read_raw_edf
再次执行奇怪的堆叠。
最后,我尝试按照本文中描述的方法进行操作。
s3 = boto3.client("s3",
region_name='us-west-2',
aws_access_key_id='access_key_id',
aws_secret_access_key='secret_access_key')
share_url = s3.generate_presigned_url(ClientMethod="get_object",
ExpiresIn=3600,
Params={"Bucket": bucket, "Key": key})
share_url
'https://my-bucket.s3.amazonaws.com/train.edf?AWSAccessKeyId=access_key_id&Signature=signature&Expires=1616777253'
这条路似乎又恢复了正常。
mne.io.read_raw_edf(share_url)
NotImplementedError: Only EDF files are supported by read_raw_edf, got edf?awsaccesskeyid=access_key_id&
signature=signature&expires=1616777253
但在这里我得到了另一个奇怪mne.io.read_raw_edf
的行为。不再堆叠,但路径被裁剪。
我认为这可能是mne.io.read_raw_edf
问题本身,但我从未在亚马逊产品之外遇到过这样的事情。
通过 URL 访问BDF和EDF文件是否有意义,或者将文件上传到SageMaker卷是否更好?如果这个问题看起来很幼稚,我深表歉意。我已经花了几天时间解决这个问题,但我需要尽快解决它,因为亚马逊在笔记本处于活动状态时每小时都会收取费用。