Python 迭代&;连接两个列表会占用大量内存

Python 迭代&;连接两个列表会占用大量内存,python,python-3.x,pandas,list,iterator,Python,Python 3.x,Pandas,List,Iterator,在Python3中,我试图从4个列表中生成这种格式的序列 <yyyymmdd>-<1-200>-<1-20>-<1-13000> 20161201-1-1-1 20161201-1-1-2 20161201-1-1-3 .. .. 20161201-1-2-1 20161201-1-2-2 .. .. 20161201-2-1-1 20161201-2-1-2 .. 20161202-1-1-1 20161202-1-1-2 .. .. 2019

在Python3中,我试图从4个列表中生成这种格式的序列

<yyyymmdd>-<1-200>-<1-20>-<1-13000>

20161201-1-1-1
20161201-1-1-2
20161201-1-1-3
..
..
20161201-1-2-1
20161201-1-2-2
..
..
20161201-2-1-1
20161201-2-1-2
..
20161202-1-1-1
20161202-1-1-2
..
..
20190701-200-20-13000
3个列表的第一个串联速度快且内存不足。 第二个连接占用了大量内存,正在被杀死

我也试着在一个48G的RAM系统上运行它,但似乎没有足够的内存来运行它

我想在解决这个问题上得到一些帮助,并理解为什么需要这么多内存。我做错了什么

更新: (我的要求)

因此,我有两个数据帧,它们有几个列,其值的格式为-,这占用了很多空间,因此我想创建所有可能值的列表,然后枚举并创建一个字典,如下所示:

---

20161201-1-1-1:0 20161201-1-1-2 : 1 20161201-1-1-3 : 2 .. .. 20190701-200-20-12999:n-1 20190701-200-20-13000:n

然后将数据帧的值替换为1,2。。。n、 n-1


还有其他方法吗?

您不需要将这些范围转换为列表

你应该这样做:

import itertools
import pandas as pd

all_dates = (d.strftime('%Y%m%d') for d in pd.date_range('20160119','20191226'))
all_users = range(0,200)
all_products = range(0,15)
all_customers = range(0,13000)

date_user_product_pairs = ( '-'.join(pair) for pair in itertools.product(all_dates,all_users, all_products))

date_user_product_customer_pairs = ( '-'.join(pair) for pair in itertools.product(date_user_product_map,all_customers))

然后,您可以使用这些成对生成器获得所需的内容。

只需使用单个生成器表达式:

sequences = ('-'.join(str(x) for x in p) for p in itertools.product(all_dates,all_users,all_products, all_customers))
用法如下:

>>> for _ in range(10): print(next(sequences))

20160119-0-0-0
20160119-0-0-1
20160119-0-0-2
20160119-0-0-3
20160119-0-0-4
20160119-0-0-5
20160119-0-0-6
20160119-0-0-7
20160119-0-0-8
20160119-0-0-9

该列表中有1000多个日期,因此您似乎正在编译一个包含400多亿个字符串的列表,每个字符串大约需要30个字节,因此您进入了TB的范围。为什么不做一个发电机呢?你真的需要一次在内存中存储所有这些字符串吗?用生成器替换所有列表谢谢。我已经根据我的实际需求更新了我的问题。请看一看。您的字典的唯一用途似乎是“枚举”(分配序列号)连接的字符串。如果这种理解是正确的,我建议你放弃拥有那本词典的想法。您可以随时使用
enumerate()
@fountainhead动态枚举示例代码将有所帮助。我希望串联值的数据帧中的序列号相同。i、 e.我想将所有数据帧中的所有
*20161201-1-1-2*
替换为
*1*
。同样地,将
*20161201-1-1-3*
替换为
*2*
。原因是,我将使用此列在数据帧之间进行合并,稍后也将使用。谢谢。但我不知道如何用这个来解决我的目的。我已经根据我的实际需求更新了我的问题。请看一看。您可以使用这些pair generator功能来进行口述,但即使这样,以后创建字典不会有类似的内存问题吗?不,您只需循环这两个,并将它们写入文件系统,而不是将其存储在内存中。如果您需要更多的计算,请使用生成器再次加载它们,在循环中进行计算并将其写回文件系统,在任何步骤中都不要存储在RAM中
>>> for _ in range(10): print(next(sequences))

20160119-0-0-0
20160119-0-0-1
20160119-0-0-2
20160119-0-0-3
20160119-0-0-4
20160119-0-0-5
20160119-0-0-6
20160119-0-0-7
20160119-0-0-8
20160119-0-0-9