Я хочу создать подвыборку из n
строк, используя Dask. Я попробовал 2 подхода:
1.Использование frac
:
import dask.dataframe as dd
read_path = ["test_data\\small1.csv", "test_data\\small2.csv", "huge.csv"]
df = dd.read_csv(read_path)
df = df.sample(frac=0.0001)
df = df.compute()
Это работает достаточно быстро - выберите 10000 из набора данных 100mil в течение 16 секунд. Но он не может гарантировать точное количество строк - он будет округлен из-за использования frac
.
2.Используется для l oop:
nrows = 10000
res_df = []
length = csv_loader.get_length()
total_len = sum(length)
start = perf_counter()
inds = random.sample(range(total_len), total_len - nrows - len(length))
min_bound = 0
relative_inds = []
for leng in length:
relative_inds.append(
sorted([i - min_bound for i in inds if min_bound <= i < min_bound + leng])
)
min_bound += leng
for ind, fil in enumerate(read_path):
res_df.append(dd.read_csv(fil, skiprows=relative_inds[ind], sample=1000000))
Здесь я вычисляю индексы строк, которые мне нужно пропустить, а затем загружаю из csv, используя skiprows
. Этот метод очень медленный и иногда дает сбой, если мне нужно прочитать 0 строк из небольшого csv. Но это гарантирует точное количество строк.
Есть ли какое-то быстрое решение для получения точного количества строк с использованием Dask?