我对Python很陌生,我必须处理大约20GB的数据文件。目前我想了解是否可以编写任何 Python 代码(如下所示(并在 GPU 上运行它。实际上我只需要打开该文件,制作类似的东西:
file=open(fnTar,"w")
for iLine in List:
iLine=iLine.replace(“\”,””)
file.write(iLine)
file.close()
我知道有像 Dask 这样的高级 API 可以更有效地处理大文件,但将来我还需要以不同的方式操作数据(一些计算(。是否可以在不更改原始脚本的情况下在 GPU 上运行此类代码?像这样:
Run this on GPU:
file=open(fnTar,"w")
for iLine in List:
iLine=iLine.replace(“\”,””)
file.write(iLine)
file.close()
我的理解是,即使使用 CUDA 也需要对代码进行一些额外的更改,如果使用像 numpy 这样的模块,您必须找到为 CUDA 开发的等效模块。所以这可能也不是我正在寻找的简单快速的解决方案。
根据我对你问题的理解,这可能不是你要找的。GPU 适合执行矩阵操作,而不是显式处理大文件。为此,您确实需要更多的内存或某种以块为单位处理它的方法。
您可以在RapidsAI框架中进行强大的字符串操作。 如果您有CSV,那么数据加载速度可能会非常快:https://blog.dask.org/2019/01/13/dask-cudf-first-steps
谢谢你的这个问题。 以下是你如何使用RAPIDS和NVIDIA GPU来快速做到这一点(无论是在时间和代码上!(。 它将要求您使用 cudf 或 nvstrings。 这些只是玩具示例,因此请根据您的用例进行适当调整。
库德夫
1( 直接创建并读取文件(假设您的用例为 CSV(:
import cudf
fn = 'test.csv'
lines = """a, b, c
test \ phase 1, 2, 3
test \phase 2, 4, 5
test\phase 3, 6, 7
"""
with open(fn, 'w') as fp:
fp.write(lines)
# File Manipulation starts here
df = cudf.read_csv(fn)
df.head()
这是输出:
a b c
0 test phase 1 2 3
1 test phase 2 4 5
2 testphase 3 6 7
2(进行更换:
df['a'] = df['a'].str.replace("\","", regex=False) # regex=False is important as this particular instance as replace won't work without it (created a github issue to fix that)!
df.head()
您的输出将是:
a b c
0 test phase 1 2 3
1 test phase 2 4 5
2 testphase 3 6 7
3( 写入文件
df.to_csv("testdone.csv")
NVSTRINGS:本部分的文档链接
对于 nvstring 解决方案,请将列表发送到设备。 我没有您的文件或其格式信息,因此如果您愿意,我会要求您尝试一下:)。但是,请注意实现的 IO,因为这种延迟可能会导致它花费比 cudf 更长的时间。 将文件发送到 GPU 并仅在 GPU 上处理它真的更好(更快(。我真的不推荐这种方式,而只是向您展示您可以在玩具示例中做什么:)。
import nvstrings
s = nvstrings.to_device(["hllo","godbye"]) #Example list, s=iLine
print(s.replace('\', '', regex=False))
输出将是:
['hllo', 'godbye']
至于 20GB 的文件大小,如果你有 GPU 内存大小,比如在 Titan RTX/GV100/或 RTX8000 上,在没有 Dask 的单个 GPU 上你应该没问题。 如果没有,请将其应用于dask_cudf
。 Dask_cudf字符串访问器源就在这里!
希望这有帮助!