Ошибка памяти с помощью ноутбука Python Jupyter [дубликат]

Не используйте дезинфицированную функцию mysql_ * (лишенная php 5.5 будет удалена в php 7). и вы можете сделать это с помощью mysqli или pdo

здесь полный запрос выбора

connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        // code here 
    }
} else {
    echo "0 results";
}
$conn->close();
?>

14
задан jezrael 11 November 2015 в 08:54
поделиться

3 ответа

Решение, если нужно создать один большой DataFrame, если необходимо обрабатывать все данные сразу (возможно, но не рекомендуется ):

Затем используйте concat для всех фрагментов в df, потому что тип вывода функции:

df = pd.read_csv('Check1_900.csv', sep='\t', iterator=True, chunksize=1000)

не является фреймворком данных, а pandas.io.parsers.TextFileReader - источником .

tp = pd.read_csv('Check1_900.csv', sep='\t', iterator=True, chunksize=1000)
print tp
#<pandas.io.parsers.TextFileReader object at 0x00000000150E0048>
df = pd.concat(tp, ignore_index=True)

Я думаю, что необходимо добавить параметр игнорировать индекс в функцию concat, так как избегать двуличности индексов.

EDIT:

Но если вы хотите работать с большими данными, такими как агрегирование, гораздо лучше использовать dask , поскольку он обеспечивает расширенный параллелизм.

16
ответ дан jezrael 26 August 2018 в 11:21
поделиться

Здесь вы не нуждаетесь concat. Это похоже на запись sum(map(list, grouper(tup, 1000))) вместо list(tup). Единственное, что делают iterator и chunksize=1000, это дать вам объект-читатель, который повторяет 1000-строчные DataFrames вместо того, чтобы читать все это. Если вы хотите все сразу, просто не используйте эти параметры.

Но если чтение всего файла в память сразу слишком дорого (например, занимает так много памяти, что вы получаете MemoryError, или замедлить вашу систему до обхода, выбросив ее в swap hell), это именно то, что chunksize для.

Проблема в том, что вы назвали результирующий итератор df, а затем попытались используйте его как DataFrame. Это не DataFrame; это итератор, который дает вам 1000-строчные DataFrames один за другим.

Когда вы говорите это:

Моя проблема: я не знаю, как использовать такие вещи, как эти ниже для всего df, а не только для одного фрагмента

. Ответ заключается в том, что вы не можете . Если вы не можете загрузить все это в один гигантский DataFrame, вы не сможете использовать один гигантский DataFrame. Вы должны переписать свой код вокруг кусков.

Вместо этого:

df = pd.read_csv('Check1_900.csv', sep='\t', iterator=True, chunksize=1000)
print df.dtypes
customer_group3 = df.groupby('UserID')

... вам нужно делать такие вещи:

for df in pd.read_csv('Check1_900.csv', sep='\t', iterator=True, chunksize=1000):
    print df.dtypes
    customer_group3 = df.groupby('UserID')

Часто , то, что вам нужно сделать, это объединить некоторые данные - уменьшить каждый кусок до чего-то гораздо меньшего с помощью только тех частей, которые вам нужны. Например, если вы хотите суммировать весь файл по группам, вы можете groupby каждый фрагмент, затем суммировать кусок по группам и хранить серию / массив / список / dict для текущих итогов для каждой группы.

Конечно, это немного сложнее, чем просто суммирование гигантской серии сразу, , но вокруг этого нет . (За исключением покупки большего количества оперативной памяти и / или переключения на 64 бита.) Вот как iterator и chunksize решают проблему: разрешая вам делать этот компромисс, когда вам нужно.

3
ответ дан abarnert 26 August 2018 в 11:21
поделиться

Вам нужно объединить патроны. Например:

df2 = pd.concat([chunk for chunk in df])

И затем запустите свои команды на df2

2
ответ дан user29791 26 August 2018 в 11:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: