问题描述
我正在使用 requests
从网上读取 .csv 文件,并通过 StringIO
将其提供给 pandas.read_csv()
。
Google Apps 引擎向我发出了内存使用量过高的警告,因此我决定使用 memory_profiler
跟踪内存分配:
Line # Mem usage Increment Occurences Line Contents
============================================================
44 86.3 MiB 86.3 MiB 1 @profile
45 def forced_load():
46 '''
47 try: # if exists locally
48 db = pd.read_csv('XXX'
49 'XXX.csv',50 sep=",",encoding='utf-8')
51 except FileNotFoundError:
52
53 '''
54 # define parameters for a request
55 86.3 MiB 0.0 MiB 1 token = 'XXX'
56 86.3 MiB 0.0 MiB 1 owner = 'XXX'
57 86.3 MiB 0.0 MiB 1 repo = 'XXX'
58 86.3 MiB 0.0 MiB 1 path = 'XXX'
59 86.3 MiB 0.0 MiB 1 filename = 'XXX'
60
61 # send a request
62 91.2 MiB 4.8 MiB 2 r = requests.get(
63 86.3 MiB 0.0 MiB 1 'https://raw.githubusercontent.com/'
64 f'{owner}/{repo}/master/{path}/{filename}',65 86.3 MiB 0.0 MiB 1 headers={
66 86.3 MiB 0.0 MiB 1 'accept': 'application/vnd.github.v3.raw',67 86.3 MiB 0.0 MiB 1 'authorization': f'token {token}'
68 }
69 )
70
71 91.2 MiB 0.0 MiB 1 r.raise_for_status()
72
73 # Load data from text
74 110.5 MiB 19.4 MiB 1 string_io_obj = StringIO(r.text)
75 116.7 MiB 6.2 MiB 1 db = pd.read_csv(string_io_obj,sep=",encoding='utf-8')
76
77 116.7 MiB 0.0 MiB 1 g.last_loaded = monotonic()
78 116.7 MiB 0.0 MiB 1 return db
有时,requests.get()
和 read_csv()
会出现奇怪的峰值:
案例 1(见第 62 和 75 行)
62 134.1 MiB 50.3 MiB 2 r = requests.get(
63 83.8 MiB 0.0 MiB 1 'https://raw.githubusercontent.com/'
64 f'{owner}/{repo}/master/{path}/{filename}',65 83.8 MiB 0.0 MiB 1 headers={
66 83.8 MiB 0.0 MiB 1 'accept': 'application/vnd.github.v3.raw',67 83.8 MiB 0.0 MiB 1 'authorization': f'token {token}'
68 }
69 )
70
71 134.1 MiB 0.0 MiB 1 r.raise_for_status()
72
73 # Load data from text
74 153.4 MiB 19.4 MiB 1 string_io_obj = StringIO(r.text)
75 117.9 MiB -35.5 MiB 1 db = pd.read_csv(string_io_obj,encoding='utf-8')
76
77 117.9 MiB 0.0 MiB 1 g.last_loaded = monotonic()
78 117.9 MiB 0.0 MiB 1 return db
案例 2(见第 62 和 75 行)
62 91.6 MiB 11.3 MiB 2 r = requests.get(
63 80.3 MiB 0.0 MiB 1 'https://raw.githubusercontent.com/'
64 f'{owner}/{repo}/master/{path}/{filename}',65 80.3 MiB 0.0 MiB 1 headers={
66 80.3 MiB 0.0 MiB 1 'accept': 'application/vnd.github.v3.raw',67 80.3 MiB 0.0 MiB 1 'authorization': f'token {token}'
68 }
69 )
70
71 91.6 MiB 0.0 MiB 1 r.raise_for_status()
72
73 # Load data from text
74 111.0 MiB 19.4 MiB 1 string_io_obj = StringIO(r.text)
75 166.1 MiB 55.1 MiB 1 db = pd.read_csv(string_io_obj,encoding='utf-8')
76
77 166.1 MiB 0.0 MiB 1 g.last_loaded = monotonic()
78 166.1 MiB 0.0 MiB 1 return db
这些 requests
和 pandas
峰值来来去去,所以我不认为它们是否需要解决。
但是,我可以观察到通过 StringIO
(第 74 行)传递网络响应输出不断消耗太多内存。
我无法直接向 read_csv()
提供 URL,因为我的网络请求包含授权标头。因此,我将响应保存到 StringIO
,然后将其传递给 read_csv()
。
我无法将响应内容写入文件,因为该应用在使用内存磁盘存储的 Google Apps 引擎中运行,写入临时文件会再次消耗内存。
问题:有没有办法摆脱第 74 行中对 StringIO 的 19Mib 分配或以任何其他方式减少内存消耗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)