Чтение очень больших файлов в PHP

То, что вам не хватает, - это cellValueFactory для ваших столбцов, которые будут сообщать столбцу, какое значение будет отображаться в его ячейках.

Что-то вроде этого:

TableView> tableView = new TableView<>();
List columnNames = dataGenerator.getNext(N_COLS);
for (int i = 0; i < columnNames.size(); i++) {
    final int finalIdx = i;
    TableColumn, String> column = new TableColumn<>(
            columnNames.get(i)
    );
    column.setCellValueFactory(param ->
            new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx))
    );
    tableView.getColumns().add(column);
}

Пример приложения

Это решение было немного основано на сообщении блога Narayan: Обновлено: Динамические данные TableView из базы данных . Вместо этого сообщения в блоге это решение использует генератор тестовых данных для генерации некоторых фиктивных данных и некоторых функций лямбда Java 8, которые делают заводское определение значения ячейки немного менее громоздким для записи и просмотра.

import javafx.application.Application;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;

import java.util.*;

public class DynamicTableView extends Application {    
    private static final int N_COLS = 5;
    private static final int N_ROWS = 1_000;

    public void start(Stage stage) throws Exception {
        TestDataGenerator dataGenerator = new TestDataGenerator();

        TableView> tableView = new TableView<>();

        // add columns
        List columnNames = dataGenerator.getNext(N_COLS);
        for (int i = 0; i < columnNames.size(); i++) {
            final int finalIdx = i;
            TableColumn, String> column = new TableColumn<>(
                    columnNames.get(i)
            );
            column.setCellValueFactory(param ->
                    new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx))
            );
            tableView.getColumns().add(column);
        }

        // add data
        for (int i = 0; i < N_ROWS; i++) {
            tableView.getItems().add(
                    FXCollections.observableArrayList(
                            dataGenerator.getNext(N_COLS)
                    )
            );
        }

        tableView.setPrefHeight(200);

        Scene scene = new Scene(tableView);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    private static class TestDataGenerator {
        private static final String[] LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tempus cursus diam ac blandit. Ut ultrices lacus et mattis laoreet. Morbi vehicula tincidunt eros lobortis varius. Nam quis tortor commodo, vehicula ante vitae, sagittis enim. Vivamus mollis placerat leo non pellentesque. Nam blandit, odio quis facilisis posuere, mauris elit tincidunt ante, ut eleifend augue neque dictum diam. Curabitur sed lacus eget dolor laoreet cursus ut cursus elit. Phasellus quis interdum lorem, eget efficitur enim. Curabitur commodo, est ut scelerisque aliquet, urna velit tincidunt massa, tristique varius mi neque et velit. In condimentum quis nisi et ultricies. Nunc posuere felis a velit dictum suscipit ac non nisl. Pellentesque eleifend, purus vel consequat facilisis, sapien lacus rutrum eros, quis finibus lacus magna eget est. Nullam eros nisl, sodales et luctus at, lobortis at sem.".split(" ");

        private int curWord = 0;

        List getNext(int nWords) {
            List words = new ArrayList<>();

            for (int i = 0; i < nWords; i++) {
                if (curWord == Integer.MAX_VALUE) {
                    curWord = 0;
                }

                words.add(LOREM[curWord % LOREM.length]);
                curWord++;
            }

            return words;
        }
    }
}

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

5 ответов

Вы уверены, что это 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 корректен относительно того, куда сценарий работает? Возможно, попытайтесь установить полный путь здесь для имени файла.

49
ответ дан ConroyP 28 November 2019 в 06:42
поделиться

Хорошо Вы могли попытаться использовать функцию readfile, если Вы просто хотите произвести файл.

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

1
ответ дан Fionn 28 November 2019 в 06:42
поделиться

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

1
ответ дан Enrico Murru 28 November 2019 в 06:42
поделиться

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

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

ini\_set("memory_limit","12M");
0
ответ дан NullPoiиteя 28 November 2019 в 06:42
поделиться
-1
ответ дан Ólafur Waage 28 November 2019 в 06:42
поделиться
Другие вопросы по тегам:

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