Большой файл Должен читать строки за строкой или загрузить файл_get_content [duplicate]

Конечно! Настройка:

>>> import pandas as pd
>>> from random import randint
>>> df = pd.DataFrame({'A': [randint(1, 9) for x in xrange(10)],
                   'B': [randint(1, 9)*10 for x in xrange(10)],
                   'C': [randint(1, 9)*100 for x in xrange(10)]})
>>> df
   A   B    C
0  9  40  300
1  9  70  700
2  5  70  900
3  8  80  900
4  7  50  200
5  9  30  900
6  2  80  700
7  2  80  400
8  5  80  300
9  7  70  800

Мы можем применить операции столбца и получить объекты Boolean Series:

>>> df["B"] > 50
0    False
1     True
2     True
3     True
4    False
5    False
6     True
7     True
8     True
9     True
Name: B
>>> (df["B"] > 50) & (df["C"] == 900)
0    False
1    False
2     True
3     True
4    False
5    False
6    False
7    False
8    False
9    False

[Обновить, чтобы перейти к новому стилю .loc]:

И тогда мы можем использовать их для индексации в объект. Для доступа к чтению вы можете привязывать индексы:

>>> df["A"][(df["B"] > 50) & (df["C"] == 900)]
2    5
3    8
Name: A, dtype: int64

, но вы можете столкнуться с проблемами из-за различий между представлением и копией, выполняющими это для доступа к записи. Вместо этого вы можете использовать .loc:

>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"]
2    5
3    8
Name: A, dtype: int64
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"].values
array([5, 8], dtype=int64)
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"] *= 1000
>>> df
      A   B    C
0     9  40  300
1     9  70  700
2  5000  70  900
3  8000  80  900
4     7  50  200
5     9  30  900
6     2  80  700
7     2  80  400
8     5  80  300
9     7  70  800

Обратите внимание, что я случайно сделал == 900, а не != 900 или ~(df["C"] == 900), но я слишком ленив, чтобы исправить это. Упражнение для читателя. : ^)

24
задан Alive to Die 5 June 2015 в 22:00
поделиться

8 ответов

Вы уверены, что это fopen, а не тайм-аут вашего скрипта? По умолчанию обычно около 30 секунд или около того, и если ваш файл занимает больше времени для чтения, это может привести к его отключению.

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

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

$handle = fopen("/tmp/uploadfile.txt", "r") or die("Couldn't get handle");
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        // Process buffer here..
    }
    fclose($handle);
}

Редактировать

PHP, похоже, не выдает ошибку, это просто возвращает false.

Правилен ли путь к $rawfile относительно того, где работает скрипт? Возможно, попробуйте установить абсолютный путь здесь для имени файла.

39
ответ дан ConroyP 22 August 2018 в 18:19
поделиться
  • 1
    Это только возможное решение, как открыть действительно большие файлы. Я обрабатываю этот файл с разрешением 1.5 ГБ без каких-либо проблем. Все другие решения, такие как file_get_contents файла, будут считывать весь файл в память. Этот подход обрабатывается последовательно. – StanleyD 22 August 2013 в 07:06
  • 2
    Почему 4096 означает одну строку? – Phoenix 3 February 2015 в 09:54
  • 3
    @Phoenix 4096 означает, что читать не более 4096 - 1 байт, если нет разрывов строк. Проверьте руководство. – a3f 9 February 2015 в 00:34
  • 4
    Для меня stream_get_line быстрее, чем fgets проверьте этот сравнительный gist.github.com/joseluisq/6ee3876dc64561ffa14b – joseluisq 11 March 2016 в 17:04
-1
ответ дан Ólafur Waage 22 August 2018 в 18:19
поделиться
  • 1
    Будьте осторожны с файлом_get_contents () для больших файлов. Хотя 6 мегабайт должно быть хорошо, потоковая передача намного лучше, поскольку он сначала не считывает весь файл в память. – Dustin Graham 10 April 2014 в 19:04

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

Использование команды yield.

https: // www. sitepoint.com/performant-reading-big-files-php/

0
ответ дан Dean Chiu 22 August 2018 в 18:19
поделиться

Я использовал fopen для открытия видеофайлов для потоковой передачи, используя php-скрипт в качестве сервера потоковой передачи видео, и у меня не было проблем с файлами размером более 50/60 МБ.

1
ответ дан Enrico Murru 22 August 2018 в 18:19
поделиться

Ну, вы можете попробовать использовать функцию readfile, если хотите просто вывести файл.

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

0
ответ дан Fionn 22 August 2018 в 18:19
поделиться
  • 1
    Мы должны автоматизировать добавление больших наборов данных, поэтому большие файлы CSV могут быть загружены пользователем и проанализированы и интегрированы в базу данных приложением. Мне бы понравились другие предложения для подхода, если вы считаете, что чтение и синтаксический анализ загруженных файлов с помощью PHP - это не лучший способ. – user 2 October 2008 в 14:22
  • 2
    Я бы не думал, что у PHP возникнет проблема с файлами csv 6MB? Кажется, это достаточно маленький файл для его обработки. В соответствии с комментариями выше, пожалуйста, сообщите точную ошибку / и / или код. Может быть ошибка памяти вашего удара? Или max_execution_time? Нам нужна дополнительная информация. – DreamWerx 2 October 2008 в 14:25

для меня, fopen() был очень медленным с файлами более 1mb, file() намного быстрее.

Просто пытаясь читать строки 100 за раз и создавать пакетные вставки, fopen() принимает 37 секунд против file() занимает 4 секунды. Должен быть, что string->array шаг встроен в file()

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

0
ответ дан Hassaan 22 August 2018 в 18:19
поделиться

Если проблема вызвана ударом ограничения памяти, вы можете попробовать установить более высокое значение (это может работать или не зависит от конфигурации php).

это устанавливает ограничение на память до 12 Мб

ini\_set("memory_limit","12M");
6
ответ дан NullPoiиteя 22 August 2018 в 18:19
поделиться
  • 1
    Примечание. Хотя это может помочь, оно только откладывает проблему: как только появляется файл размером 15 МБ, проблема возвращается. (Если ваши файлы никогда не пройдут определенный предел, это может привести к тому, что проблема исчезнет.) – Piskvor 9 September 2010 в 09:57
  • 2
    Вы можете поделиться своим кодом? – Hassaan 11 May 2018 в 07:35
  • 3
    Я хочу сравнить это с моими файлами – Hassaan 12 May 2018 в 03:48
7
ответ дан Wolverine 5 November 2018 в 15:41
поделиться
Другие вопросы по тегам:

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