洗牌算法
记录一下,有一个超大的数据集文件,我需要把它打乱顺序,但是呢!文件太大,无法直接导入内存,只能用数据流的方式迭代读取;
这里记录两种方式;
第一种方式:
def split_data_set(dataSet_dir):
"""
洗牌算法
"""
val_dataSet_dir = 'D_val.csv'
train_dataSet_dir = 'D_train.csv'
s0 = time.clock()
# 计算文件有多少行
count = 0
with open(dataSet_dir, 'r', encoding='utf-8') as f:
for line in f:
if line != '':
count += 1
print('该文件共有{}条样本'.format(count))
# 打乱样本索引
index = np.arange(count)
random.shuffle(index) # 该方法直接作用于indices没有返回值
# 按照 发牌方式 记录下打乱的位置
files = [] # 临时文件列表
mx = [] # 牌堆的最大值
for i, n in enumerate(index):
# print(mx)
# print(files)
pos = bisect.bisect_left(mx, n) - 1
if pos == -1:
files.insert(0, [n])
mx.insert(0, n)
else:
files[pos].append(n)
mx[pos] = n
# 生成P个临时文件
print('临时文件个数 ',len(files))