洗牌算法
记录一下,有一个超大的数据集文件,我需要把它打乱顺序,但是呢!文件太大,无法直接导入内存,只能用数据流的方式迭代读取;
这里记录两种方式;
第一种方式:
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))

本文介绍了如何在处理超大文件时对其进行洗牌操作,以打乱数据顺序。讨论了三种方法,包括按顺序分发到多个牌堆、使用seek()指针定位以及通过索引读取指定行。由于大文件无法一次性加载到内存,这些方法着重于数据流的处理,尤其关注效率和Linux系统的文件打开限制。
最低0.47元/天 解锁文章
4026

被折叠的 条评论
为什么被折叠?



