Как читать небольшой процент строк очень большого CSV. Панды - временной ряд - Большой набор данных - PullRequest
2 голосов
/ 23 мая 2019

У меня есть временной ряд в большом текстовом файле. Этот файл больше 4 ГБ.

Поскольку это временной ряд, я хотел бы прочитать только 1% строк.

Желаемый минималистский пример:

df = pandas.read_csv('super_size_file.log',
                      load_line_percentage = 1)
print(df)

желаемый вывод:

>line_number, value
 0,           654564
 100,         54654654
 200,         54
 300,         46546
 ...

Я не могу выполнить повторную выборку после загрузки, поскольку для ее загрузки требуется слишком много памяти.

Я могу захотеть загрузить чанк по чанку и заново сэмплировать каждый чанк. Но это кажется мне неэффективным.

Любые идеи приветствуются. ;)

Ответы [ 3 ]

3 голосов
/ 23 мая 2019

Каждый раз, когда мне приходится иметь дело с очень большим файлом, я спрашиваю: «Что бы Dask сделать?».

Загрузить большой файл как dask.DataFrame, преобразовать индекс встолбец (обходной путь из-за недоступности полного управления индексами) и фильтр для этого нового столбца.

import dask.dataframe as dd
import pandas as pd

nth_row = 100  # grab every nth row from the larger DataFrame
dask_df = dd.read_csv('super_size_file.log')  # assuming this file can be read by pd.read_csv
dask_df['df_index'] = dask_df.index
dask_df_smaller = dask_df[dask_df['df_index'] % nth_row == 0]

df_smaller = dask_df_smaller.compute()  # to execute the operations and return a pandas DataFrame

Это даст вам строки 0, 100, 200 и т. д. из файла большего размера.Если вы хотите сократить DataFrame до определенных столбцов, сделайте это перед вызовом compute, т.е. dask_df_smaller = dask_df_smaller[['Signal_1', 'Signal_2']].Вы также можете вызвать compute с опцией scheduler='processes', чтобы использовать все ядра вашего процессора.

2 голосов
/ 23 мая 2019

Взгляните на Итерация по фрагментам файлов по фрагменту .Он содержит элегантное описание, как читать CSV-файл в чанках.

Основная идея - передать параметр chunksize (количество строк на чанк).Затем, в цикле, вы можете прочитать этот файл по частям.

2 голосов
/ 23 мая 2019

Вы можете ввести количество строк, которые вы хотите прочитать, когда используете функцию read_csv pandas. Вот что вы могли бы сделать:

import pandas as pd
# Select file 
infile = 'path/file'
number_of_lines = x
# Use nrows to choose number of rows
data = pd.read_csv(infile,, nrows = number_of_lines*0.01)

Вы также можете использовать опцию chunksize, если хотите прочитать порцию данных по порциям, как вы упомянули:

chunksize = 10 ** 6
for chunk in pd.read_csv(filename, chunksize=chunksize):
    process(chunk)
...