2016-07-06 1 views
1

Не могли бы вы мне помочь, я столкнулся с проблемой чтения случайных строк из большого файла csv с использованием 0.18.1 pandas и 2.7.10 Python в Windows (оперативная память 8 ГБ) ,Чтение случайных строк большого файла csv, python, pandas

В Read a small random sample from a big CSV file into a Python data frame я увидел подход, однако, это произошло на моем компьютере, чтобы быть очень требовательно к памяти, а именно часть кода:

n = 100 
s = 10 
skip = sorted(rnd.sample(xrange(1, n), n-s))# skip n-s random rows from *.csv  
data = pd.read_csv(path, usecols = ['Col1', 'Col2'], 
        dtype = {'Col1': 'int32', 'Col2':'int32'}, skiprows = skip) 

так, если я хочу взять несколько случайных строк из файл с учетом не только 100 строк, но 100 000, становится трудно, однако с не случайные строки из файла почти в порядке:

skiprows = xrange(100000)  
data = pd.read_csv(path, usecols = ['Col1', 'Col2'], 
        dtype = {'Col1': 'int32', 'Col2':'int32'}, skiprows = skip, nrows = 10000) 

Таким образом, вопрос, как я могу иметь дело с чтением большого числа случайных строк из большой файл csv wi то есть, поскольку я не могу прочитать весь файл csv, даже с его разбиением, меня интересуют именно случайные строки. Благодаря

+1

Я думаю, что большая часть обсуждения этого вопроса будет актуальной. Короче говоря, не было большого решения, которое не было бы интенсивным с точки зрения памяти. http://stackoverflow.com/questions/38039723/splitting-a-large-pandas-dataframe-with-minimal-memory-footprint/38086123#38086123 – Jeff

+1

skiprows использует много памяти, попробуйте использовать с кусками: http: // stackoverflow.com/questions/36874993/pandas-memory-error-after-a-certain-skiprows-parameter – ayhan

+0

Если вы перейдете к одной из этих ссылок и найдете их полезными, пожалуйста, повысьте их, если сможете. Вам нужно 15 репутации для повышения. У вас теперь есть 6. – piRSquared

ответ

0

Я думаю, что это быстрее, чем другие методы, показанные здесь, и, возможно, стоит попробовать.

Скажем, мы уже выбрали строки, которые нужно пропустить в списке skipped. Во-первых, я конвертирую его в таблицу поиска bool.

# Some preparation: 
skipped = np.asarray(skipped) 
# MAX >= number of rows in the file 
bool_skipped = np.zeros(shape(MAX,), dtype=bool) 
bool_skipped[skipped] = True 

Главный материал:

from io import StringIO 
# in Python 2 use 
# from StringIO import StringIO 

def load_with_buffer(filename, bool_skipped, **kwargs): 
    s_buf = StringIO() 
    with open(filename) as file: 
     count = -1 
     for line in file: 
      count += 1 
      if bool_skipped[count]: 
       continue 
      s_buf.write(line) 
    s_buf.seek(0) 
    df = pd.read_csv(s_buf, **kwargs) 
    return df 

Я проверил его следующим образом:

df = pd.DataFrame(np.random.rand(100000, 100)) 
df.to_csv('test.csv') 

df1 = load_with_buffer('test.csv', bool_skipped, index_col=0) 

с 90% строк пропущено. Он сравнивается с

pd.read_csv('test.csv', skiprows=skipped, index_col=0) 

и примерно в 3-4 раза быстрее, чем использование дачи или чтение в кусках.

0

Если память является самой большой проблемой, возможное решение было бы использовать куски, и случайным образом выбрать из кусков

n = 100 
s = 10 
factor = 1 # should be integer 
chunksize = int(s/factor) 

reader = pd.read_csv(path, usecols = ['Col1', 'Col2'],dtype = {'Col1': 'int32', 'Col2':'int32'}, chunksize=chunksize) 

out = [] 
tot = 0 
for df in reader: 
    nsample = random.randint(factor,chunksize) 
    tot += nsample 
    if tot > s: 
     nsample = s - (tot - nsample) 
    out.append(df.sample(nsample)) 
    if tot >= s: 
     break 

data = pd.concat(out) 

И вы можете использовать фактор контролировать размеры кусков.

+0

Одна из проблем заключается в том, что этот подход не является по-настоящему случайным, поскольку вы вынуждаете выборы из каждого фрагмента. Например, возможно, хотя и небезопасно, что случайный выбор n элементов - это первые n элементов, и этот подход не допускает этой возможности. Однако вы также можете утверждать, что этот подход достаточно хорош для большинства случаев, требующих случайного выбора. – root

+0

Правильно. Я отредактировал ответ, чтобы принять это во внимание, где количество выборок из каждого фрагмента является случайным. Но, тем не менее, все еще есть оговорка в том, что он должен иметь по крайней мере «факторные» образцы на кусок, чтобы получить необходимое количество выборок до достижения конца файла. Чтобы быть действительно случайным, нужно рассмотреть возможность перебора файла более одного раза. –

+0

Спасибо, да, действительно, я считаю, что это также выход: случайным образом выбирать куски и произвольно выбирать строки из них и выполнять эту операцию итеративно. Он выглядит менее требовательным к памяти, чем опция sciprows. –

 Смежные вопросы

  • Нет связанных вопросов^_^